Jest : 模拟导入 JSON 文件

Posted

技术标签:

【中文标题】Jest : 模拟导入 JSON 文件【英文标题】:Jest : Mock import of JSON file 【发布时间】:2017-08-16 14:57:36 【问题描述】:

我目前正在测试我的一个 React 组件,如下所示:

it('renders correctly', () => 
  const tree = renderer.create(<Scene ...props />).toJSON();
  expect(tree).toMatchSnapshot();
);

我的组件Scene 导入了一个setting.json 文件。我在我的本地实例上有那个文件,但我没有将它推送到我的 CI 实例上。因此,当它尝试导入它时,找不到该文件。

有没有办法在我的测试中模拟这个文件?

【问题讨论】:

我认为你必须为它创建一个手动模拟。 【参考方案1】:

您可以在开玩笑设置中使用moduleNameMapper 将导入指向模拟的 json 文件。


  "moduleNameMapper": 
    "setting.json": "<rootDir>/__mocks__/setting.json"
  

或者您可以在测试中使用jest.mock 直接模拟文件,注意您必须添加 virtual: true 参数。

jest.mock('path/to/setting.json', ()=>(
  settings: 'someSetting'
),  virtual: true )

【讨论】:

我尝试了 jest.mock 方法,但收到以下错误 Cannot find module 'path/to/setting.json' from 'get.test.js' 请注意路径是相对于测试文件的。 我想模拟一个实际上并不存在的“虚拟”文件。为此,需要选项 virtual: true。示例:jest.mock('path/to/file, () =&gt; ( foo: 'bar'), virtual: true )。谢谢@andreas-köberle 更新了你的发现的答案 我完成了这项工作,以便为测试文件中的所有测试提供一个共享模拟。但是如何为测试文件中的每个测试用例配置不同的模拟呢?【参考方案2】:

对于那些希望以Array 的形式模拟 JSON 的人,只需从回调中返回一个数组。

jest.mock('./data.json', () => ([1, 2, 3]));

您也可以返回其他有效的 JSON 类型:ObjectStringNumberBooleanNull

【讨论】:

以上是关于Jest : 模拟导入 JSON 文件的主要内容,如果未能解决你的问题,请参考以下文章

jest.mock():如何使用工厂参数模拟 ES6 类默认导入

Jest 手动模拟在 CRA 中不使用模拟文件

如何在 Jest 测试中导入 JSON 文件?

我可以将 Jest Mocks 放在不同的文件中并将其导入我的测试文件吗?

ReferenceError:您正在尝试在 Jest 环境被拆除后“导入”一个文件

使用 Jest 模拟命名导入