我试图在导入的 React module中只模拟一个函数,保持module的其余部分不被模拟,并在所有测试的顶层执行此操作。
我正在使用带有单个测试的新 create-react-app 项目来观察问题。
重现步骤:
create-react-app test
- 使用
src/App.test.js
作为唯一的测试文件提供 npm run test
应用程序.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
使用 vanilla Jest 和require
.
为什么静态React
导入被嘲笑React2
,而其余的则不是?里面究竟发生了什么?
如何jest.dontMock
修复当前行为以在顶层部分模拟module?