Jest模拟默认导出 - 需要vs导入

时间:2017-11-01 14:03:13

标签: javascript jestjs es6-modules

我在这里看到有关嘲笑默认出口的问题,但是我不认为这已经被问过:

当模拟正在测试的模块的依赖项的默认导出时,如果模块使用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();

1 个答案:

答案 0 :(得分:7)

您可以使用es6 importrequire js在jest测试中导入js文件。

使用es6 import时,您应该知道jest正在尝试解析所有依赖项,并且还会调用要导入的类的构造函数。在此步骤中,您无法模拟它。必须成功解决依赖关系,然后才能继续进行模拟。

我还应该补充一点,可以看出here jest默认情况下将任何jest.mocks提升到文件的顶部,这样放置导入的顺序并不重要。

你的问题虽然不同。您的模拟函数假定您已使用require js包含您的js文件。

jest.mock('./dependecy', () => {
   return {
      default: jest.fn()
   };
});

使用require js导入文件时,这是它具有的结构:

enter image description here

所以假设我已经导入了我的班级,名为" 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());
相关问题