我在这里看到有关嘲笑默认出口的问题,但是我不认为这已经被问过:
当模拟正在测试的模块的依赖项的默认导出时,如果模块使用ES6 import语句导入依赖项,则测试套件无法运行,说明TypeError: (0 , _dependency.default) is not a function
它成功,但是,如果模块使用require().default
调用。
据我了解,import module from location
直接转换为const module = require(location).default
,所以我很困惑为什么会这样。我宁愿保持我的代码风格一致,也不要在原始模块中使用require
调用。
有办法吗?
使用mock测试文件:
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();
});
Dependency.js
export default () => console.log('do something');
module.js(不工作)
import dependency from './dependency.js';
dependency();
module.js(工作)
const dependency = require('./dependency.js').default;
dependency();
答案 0 :(得分:7)
您可以使用es6 import
或require js
在jest测试中导入js文件。
使用es6 import
时,您应该知道jest正在尝试解析所有依赖项,并且还会调用要导入的类的构造函数。在此步骤中,您无法模拟它。必须成功解决依赖关系,然后才能继续进行模拟。
我还应该补充一点,可以看出here jest默认情况下将任何jest.mocks提升到文件的顶部,这样放置导入的顺序并不重要。
你的问题虽然不同。您的模拟函数假定您已使用require js
包含您的js文件。
jest.mock('./dependecy', () => {
return {
default: jest.fn()
};
});
使用require js
导入文件时,这是它具有的结构:
所以假设我已经导入了我的班级,名为" Test"使用require js
,它有一个名为" doSomething"我可以通过做类似的事情在我的测试中调用它:
const test = require('../Test');
test.default.doSomething();
使用es6 import
导入时,您应该采用不同的方式。使用相同的例子:
import Test from '../Test';
Test.doSomething();
编辑:如果您想使用es6 import
将模拟功能更改为:
jest.mock('./dependecy', () => jest.fn());