繁体   English   中英

开玩笑模拟默认导出 - 需要与导入

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM