如何开玩笑地模拟文件夹中的所有文件

Posted

技术标签:

【中文标题】如何开玩笑地模拟文件夹中的所有文件【英文标题】:How to mock all files in a folder in jest 【发布时间】:2021-10-14 23:03:47 【问题描述】:

我有如下文件

widgets
|
 --tabs
    |
     -- __mocks_
        |
         -- index.ts
     -- index.ts
 --button
    |
     -- __mocks_
        |
         -- index.ts
     -- index.ts

它作为文件导入/使用

import  Button  from 'common/widgets/button';

我可以单独模拟其中的每一个。

jest.mock('common/widgets/tabs');
jest.mock('common/widgets/button');

但是有没有办法模拟它们,比如将所有这些添加到文件中并导入它们,或者像下面这样使用一个通用的模拟文件夹和一个索引文件。

jest.mock('common/widgets');

【问题讨论】:

我发布了一个答案。看看吧 【参考方案1】:

你可以这样做(P.S.所有函数和函数调用只是为了演示:

文件夹结构

小部件/按钮/index.js

// demonstration
const someFunction = () => 
  console.log("widgets/button")


export default someFunction;

小部件/标签/index.js

// demonstration
const someFunction = () => 
  console.log("widgets/tabs")


export default someFunction;

小部件/index.js

export  default as Button  from './button/index';
export  default as Tabs  from './tabs/index';

-- 用法 您可以在任何文件中将函数导入为命名导入。例如。: /any/file.js

import  Button, Tabs  from 'common/widgets'
...

因此,您应该能够将它们导入到单个模拟文件中。

模拟/index.js

jest.mock('common/widgets');

【讨论】:

如果这能解决您的问题,请告诉我。 (✓ + ^) 感谢您的解决方案。我知道这一点。我不能将所有这些导入到同一个文件中,因为它们可能是相互依赖的。有没有其他办法 您可以使用 Enyzme,正如 [quora.com/… 所说,您仍然可以使用 Enzyme 提供的 mount 功能,该功能将安装页面及其所有嵌套组件,然后您可以执行任何您希望在测试中操作页面的预期操作【参考方案2】:

当我们在测试文件中导入任何模块时,jest 会检查 ./__mocks__ 目录中是否存在该模块的模拟实现。如果 jest 找到它,那么 jest 将简单地模拟该模块。

在您的情况下,您的 ./__mocks__ 目录中已经有模拟模块。 您不需要 jest.mock() api 来模拟您的模块。

Jest mock 旨在模拟模块而不是包含模块的目录。

【讨论】:

任何可以证实这一点的链接,因为根据我的经验,它是相同的。我们需要设置的任何笑话配置都会自动发生。

以上是关于如何开玩笑地模拟文件夹中的所有文件的主要内容,如果未能解决你的问题,请参考以下文章

如何开玩笑地模拟 VueAxios

如何开玩笑地模拟 i18next 模块

如何使用 Jest 模拟异步函数

我们如何开玩笑地模拟 bpmn-js?

Jest - 模拟函数,从另一个文件导入

我如何开玩笑地模拟 react-i18next 和 i18n.js?