【问题标题】:Why is Jest still requiring a mocked module?为什么 Jest 仍然需要一个模拟模块?
【发布时间】:2019-09-02 01:48:28
【问题描述】:

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

// 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

这是怎么回事?

【问题讨论】:

    标签: javascript mocking jestjs node-modules


    【解决方案1】:

    这让我绊倒了好几次。

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

    两种可能的解决方案:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-23
      • 2019-07-07
      • 1970-01-01
      • 2019-08-17
      • 2015-08-15
      • 2015-02-05
      • 1970-01-01
      相关资源
      最近更新 更多