为什么Jest仍然需要模拟模块?

时间:2019-04-11 12:14:35

标签: javascript mocking jestjs node-modules

我正在使用Jest模拟模块,因为它包含不应在测试中运行的代码。但是从输出中我可以看到模块 中的代码正在运行。

// foo.js
console.log('Hello')

// test.js
jest.mock('./foo')
const foo = require('./foo')

test.todo('write some tests')

控制台输出

PASS  test.js
  ✎ todo 1 test

console.log foo.js:1
Hello

这是怎么回事?

1 个答案:

答案 0 :(得分:0)

这使我绊了好几次。

如果不向jest.mock提供模拟实现,它将返回一个对象,该对象镜像模拟模块的输出,但每个函数都被模拟jest.fn()替换。这很整洁,因为通常它是您想要的。但是,为了确定模块的导出,必须首先require。这就是导致console.log运行的原因。

两种可能的解决方案:

  • 不要在模块的顶层运行代码:而是导出一个运行代码的函数。
  • 提供您自己的模拟实现,因此无需自检模块jest.mock('./foo', () => {})