jestjs/jest

Allow mocking `require.resolve`

Open

#9,543 创建于 2020年2月9日

在 GitHub 查看
 (26 评论) (20 反应) (0 负责人)TypeScript (6,653 fork)batch import
:rocket: Feature RequestHelp WantedPinned

仓库指标

Star
 (45,361 star)
PR 合并指标
 (平均合并 11天 22小时) (30 天内合并 11 个 PR)

描述

🚀 Feature Proposal

The require.resolve function is re-created for every file: this is needed so that it starts resolving from the correct location.

However, this makes it impossible to mock it: require.resolve = jest.fn() doesn't work. I propose adding an API similar to jest.mock specifically for require.resolve's behavior.

Motivation

We have different tests in @babel/core that test plugins/presets aliasing (ref). For example, we test that when someone uses @babel/env in their config Babel tries to resolve @babel/preset-env.

We currently rely on "fake" node_modules folders, however:

  1. We don't want to test node's resolution algorithm, we should only test what we are asking node to resolve.
  2. Using real FS just to check plugins/presets aliasing makes our tests slower.
  3. This approach doesn't work with Yarn PnP, because it changes the resolution behavior (and it shouldn't affect our tests).

Example

Maybe something like this?

jest.mockResolution("@babel/env", __dirname + "/fake/@babel/preset-env");

// test

jest.unmockResolution("@babel/env");

Pitch

Mocks are already handled by the Jest core platform :grin:

贡献者指南