我在使用已安装依赖项的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';
};
:
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
我在这里缺少什么?
二进制文件:
npmPackages:
答案 0 :(得分:0)
您的问题可能是由模块加载顺序引起的,但我不确定从my-module
更改为./my-module
的更改方式。将console.log(require('path').join(__dirname, __filename))
添加到my-module
和my-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