【问题标题】:Jest: automock modules, but only those defined in __mocks__, rather than all笑话:automock 模块,但仅限于 __mocks__ 中定义的模块,而不是全部
【发布时间】:2020-08-07 18:03:41
【问题描述】:

TL;DR

我希望启用某种automock 功能,但仅(并且仅!)我在相应__mocks__ 文件夹中明确定义的模块。在 Jest 中有没有办法做到这一点?

也欢迎一般的意见和建议。

一点上下文: (可选)

原来我完全误解了 Jests automock 功能。顺便说一句,现在回想起来,我不明白为什么,因为文档非常清楚它的实际作用:

这个选项告诉 Jest 你的测试中所有导入的模块应该被自动模拟。

好像我刚刚注意到 ALL 关键字。也许我只是在想 - 但即使对于我实际上要在这里测试的导入函数,拥有一个 automock 也是没有意义的,不是吗?显然我想从node_modules 自动模拟第三方的东西,但不是我自己的代码。事实证明:

注意:节点模块会在您手动模拟时自动模拟(例如:__mocks__/lodash.js)。

注意:核心模块,如 fs,默认情况下不会模拟。它们可以被明确地模拟,例如jest.mock('fs')

所以这与我认为的相反。

【问题讨论】:

  • 您想要的是开箱即​​用的 Jest 中的默认值,而不改变其行为。至少对于 create-react-app 它的行为方式是这样的。
  • 您的意思是在 CRA 中,如果您为给定模块创建一个 mock 并将其放在 __mocks__ 中,它将自动被包含而不是原始模块,无需任何额外配置?
  • @timotgl 你有没有在实践中尝试过,或者这只是一个假设?你可以链接相应的文档吗?因为这里绝对不是这样的。
  • 我想你和我一样误解了这个功能——来自__mocks__ 的模块不会被自动拾取,需要明确调用jest.mock('module_name') 才能被拾取。这里有一个专门的警告:jestjs.io/docs/en/manual-mocks#mocking-user-modules
  • 是的,你是对的@jayarijo,我忘记了手动 jest.mock 调用。我和你一样一无所知:D 然而,你可以做的是有一个 index.js 在你自己的所有模拟上调用 jest.mock ,然后在每次测试中只导入这个“模拟加载器”一次,而不是列出所有每次的模块。

标签: javascript typescript unit-testing jestjs automocking


【解决方案1】:

如果我理解正确,您的 __mocks__ 文件夹中有某些模拟文件,您希望在需要时将它们作为测试文件导入的一部分进行全局替换。

Jest 有一种配置方法。如果你浏览 Jest 配置文档,你会发现一个名为 moduleNameMapper 的属性,它接受一个对象,键是正则表达式,值是与正则表达式匹配的相应模块的模拟路径。

在您的jest.config.js 中,您需要添加一个单独的参数并指定模拟模式和路径。

moduleNameMapper: {
    "/^bootstrap/": "<root>/tests/__mocks__/bootstrapMock.js",
    "/^axios/": "<root>/tests/__mocks/axiosMock.js"
}

你可以在Jest docs找到更多关于使用的信息。

但是,如果您不想经历所有这些,也可以通过在您的 node_modules 文件夹旁边放置一个 __mocks__ 文件夹来实现。但是,正如Manual Mocks 的文档中所定义的那样:

如果我们想模拟 Node 的核心模块(例如:fs 或路径),那么显式调用例如jest.mock('path') 是必需的,因为默认情况下不模拟核心 Node 模块。

【讨论】:

    猜你喜欢
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 2014-09-16
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多