我正在尝试模拟导入的React模块中的一个函数,保持模块的其余部分未模拟,并在所有测试的顶层执行此操作。
我正在使用全新的create-react-app项目,并使用单个测试来观察问题。
重现步骤:
create-react-app test
- 将提供的
src / App.test.js
用作唯一的测试文件 npm run test
App.test.js
jest.mock('react', () => {
jest.dontMock('react');
const React = require('react');
const lazy = jest.fn();
return {
...React,
lazy
};
});
import * as React from 'react';
const React2 = require('react');
it('should partially mock React module', async () => {
expect(jest.isMockFunction(React.lazy)).toBe(true); // passes
expect(jest.isMockFunction(React2.lazy)).toBe(true); // fails
expect(jest.isMockFunction(require('react').lazy)).toBe(true); // fails
expect(jest.isMockFunction((await import('react')).lazy)).toBe(true); // fails
});
这里的问题似乎是 jest.dontMock
阻止了对 require
和动态 import
的模拟,但目前还不清楚为什么可以用这种方式模拟静态 import
,因为它无论如何都使用了 require
。以下是转换后的文件:"use strict";
jest.mock('react', () => {
jest.dontMock('react');
const React = require('react');
const lazy = jest.fn();
return (0, _objectSpread2.default)({}, React, {
lazy
});
});
var _interopRequireWildcard3 = require("...\\node_modules\\@babel\\runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("...\\node_modules\\@babel\\runtime/helpers/interopRequireDefault");
var _interopRequireWildcard2 = _interopRequireDefault(require("...\\node_modules\\@babel\\runtime/helpers/interopRequireWildcard"));
var _objectSpread2 = _interopRequireDefault(require("...\\node_modules\\@babel\\runtime/helpers/objectSpread"));
var React = _interopRequireWildcard3(require("react"));
const React2 = require('react');
...
这可能与create-react-app Jest+Babel设置有关,因为我无法使jest.dontMock
在纯Jest和require
下正常工作。
为什么静态的React
导入被模拟,而React2
和其余部分没有被模拟?里面到底发生了什么?
如何修复jest.dontMock
当前的行为,以便在顶层部分模拟一个模块?
require.requireActual
。此外,使用它时不需要jest.dontMock('react')
。我不知道为什么dontMock
在导入和引用方面的行为不同 - 它应该在两种情况下都防止模拟。 - AWolf