[英]Jest mocking default exports - require vs import
我在这里看到了关于用 jest 模拟默认导出的问题,但我认为这已经被问过了:
在模拟正在测试的模块的依赖项的默认导出时,如果模块使用 ES6 导入语句导入依赖项,则测试套件将无法运行,说明TypeError: (0 , _dependency.default) is not a function
It succeeds ,但是,如果模块使用require().default
调用代替。
据我了解, import module from location
直接转换为const module = require(location).default
,所以我很困惑为什么会这样。 我宁愿保持我的代码风格一致,而不是在原始模块中使用require
调用。
有没有办法做到这一点?
带模拟的测试文件:
import './modules.js';
import dependency from './dependency';
jest.mock('./dependency', () => {
return {
default: jest.fn()
};
});
// This is what I would eventually like to call
it('calls the mocked function', () => {
expect(dependency).toHaveBeenCalled();
});
依赖.js
export default () => console.log('do something');
module.js(不工作)
import dependency from './dependency.js';
dependency();
module.js(工作)
const dependency = require('./dependency.js').default;
dependency();
您可以使用es6 import
或者require js
在您的jest测试中导入您的js文件。
使用es6 import
您应该知道jest正在尝试解析所有依赖项,并且还调用要导入的类的构造函数。 在此步骤中,您无法模拟它。 必须成功解决依赖关系,然后才能继续进行模拟。
我还应该补充一点, 这里可以看到jest默认情况下将任何jest.mocks提升到文件的顶部,这样放置导入的顺序并不重要。
你的问题虽然不同。 您的模拟函数假定您已使用require js
包含了js文件。
jest.mock('./dependecy', () => {
return {
default: jest.fn()
};
});
使用require js
导入文件时,这是它具有的结构:
因此,假设我使用require js
导入了名为“Test”的类,并且它有一个名为“doSomething”的方法,我可以通过执行以下操作在我的测试中调用它:
const test = require('../Test');
test.default.doSomething();
使用es6 import
,您应该采用不同的方式。 使用相同的例子:
import Test from '../Test';
Test.doSomething();
编辑:如果你想使用es6 import
更改您的模拟功能:
jest.mock('./dependecy', () => jest.fn());
你有没有尝试过这样的事情? 几个月来,我一直在处理默认导出模拟,直到我发现了这一点。
jest.mock('./dependency', () => () => jest.fn());
此行背后的想法是您正在导出一个作为函数的模块。 所以你需要让 Jest 知道它必须将你所有的./dependency
文件模拟为一个函数,它返回一个jest.fn()
如果您想使用import dependency from 'dependency'
项,则 ES 模块的简短答案
jest.mock('dependency', () => ({
...jest.requireActual('dependency'),
__esModule: true,
default: jest.fn(),
}))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.