jest.setMock不适用于已安装的依赖项

时间:2018-04-28 17:19:28

标签: javascript unit-testing jestjs

我在使用已安装依赖项的TARGET_LINK_LIBRARIES时遇到问题

所以,我有一个功能来测试哪个需要jest.setMock依赖:

my-module

我在// my-module/index.js import { hello } from 'my-dep'; export const doSomething = () => { return hello(); }; // my-dep // location: my-module/node_modules/my-dep/index.js export const hello = () => { return 'dude'; };

中“{npm链接”了my-module
app

我写了一个测试文件如下:

cd my-module
npm link
cd app
npm link my-module

我不明白为什么嘲弄// app/feature.test.js jest.setMock('my-dep', { hello: () => 'world' }); const { doSomething } = require('my-module'); it('should return dude', () => { expect(doSomething()).toBe('dude'); }); 不起作用并调用实际的my-dep函数。

当我尝试将hello()文件用作相对导入&安装my-module依赖,模拟工作:

my-dep

我在这里缺少什么?

环境:

二进制文件:

  • 节点:8.9.4
  • 纱线:1.3.2
  • npm:5.6.0

npmPackages:

  • jest:^ 22.4.3 => 22.4.3

一些相关问题:

  1. https://github.com/facebook/jest/issues/701
  2. https://github.com/facebook/jest/issues/796

1 个答案:

答案 0 :(得分:0)

您的问题可能是由模块加载顺序引起的,但我不确定从my-module更改为./my-module的更改方式。将console.log(require('path').join(__dirname, __filename))添加到my-modulemy-dep的顶部后,我希望看到控制台输出。

您分享的

This comment in the Jest issue表示jest.setMock语句之前未提升import。如果您将其切换为使用悬挂的jest.mock,是否有效?

jest.mock('my-dep', () => ({
  hello: () => 'world'
}));

关于手动模拟的Jest文档提到this note中的提升:

  

如果您正在使用ES模块导入,那么您通常倾向于将导入语句放在测试文件的顶部。但是通常你需要指示Jest在模块使用它之前使用模拟。出于这个原因,Jest会自动将jest.mock次呼叫提升到模块的顶部(在任何导入之前)。

有关在JavaScript中提升的更多信息,请参阅You Don't Know JS: Scope & Closures - Chapter 4: Hoisting