使用 Jest 手动模拟 React-Intl 进行快照测试

Posted

技术标签:

【中文标题】使用 Jest 手动模拟 React-Intl 进行快照测试【英文标题】:Manual mock React-Intl with Jest to have snapshot testing 【发布时间】:2017-10-01 08:12:34 【问题描述】:

我一直在努力嘲笑 React-Intl library 和 Jest,因为我在运行测试时遇到了这个错误:

Invariant Violation: [React Intl] Could not find required `intl` object. <IntlProvider> needs to exist in the component ancestry.

这个库的documentation 说我们必须在根项目中创建一个名为__Mocks__ 的文件夹,然后添加这个文件:

// ./__mocks__/react-intl.js
import React from 'react';
const Intl = require.requireActual('react-intl');

// Here goes intl context injected into component, feel free to extend
const intl = 
  formatMessage: (defaultMessage) => defaultMessage
;

Intl.injectIntl = (Node) => (props) => <Node ...props intl=intl/>;

module.exports = Intl;

但是什么也没发生。

【问题讨论】:

【参考方案1】:

经过几个小时的研究,我发现我需要改变的是我需要 react-intl 包的方式。所以,我改变了那行:

const Intl = require.requireActual('react-intl');

到那个:

const Intl = jest.genMockFromModule('react-intl');

所以最终的文件是这样的:

import React from 'react';
const Intl = jest.genMockFromModule('react-intl'); // <-- This is the change

const intl = 
  formatMessage: (defaultMessage) => defaultMessage
;

Intl.injectIntl = (Node) => (props) => <Node ...props intl=intl/>;

module.exports = Intl;

希望这会有所帮助!

【讨论】:

你必须使用const Intl = jest.genMockFromModule('react-intl'); 如何让 Jsx 元素与 module.js 文件一起使用?由于未知字符“,Jest 无法运行测试

以上是关于使用 Jest 手动模拟 React-Intl 进行快照测试的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 Typescript 从 Jest 手动模拟中导入函数

react-intl 与 react-testing-library 给出了无效的钩子调用错误

ES6类开玩笑嘲弄

如何使用 jest.fn() 在 jest 中使用 typescript 模拟函数

如何使用 jest.fn() 模拟属性