我有一个反应原生的容器,它导入我们通常存储在utils
目录中的典型函数,例如capitaliseWord()
或其他任何东西。
utils
模块的一个功能使用t
,所以我们在i18n
文件夹中导入utils
以便能够使用t
我们在languageDetector
中使用i18n
来检测用户的移动语言。因为languageDetector
需要deviceLocale
(例如英国,美国,NL等),并且Jest在不同的环境中运行,如果我尝试测试容器,我将得到Cannot read property 'deviceLocale' of undefined
。
所以我创建了一个手动__mocks__
目录(作为https://jestjs.io/docs/en/manual-mocks#mocking-user-modules状态),我创建了自己的i18n
,只是手动注入deviceLocale
字符串,以便能够运行测试。
原来测试忽略了__mocks__/i18n
并直接指向原来的...任何想法可能会出错?
我的jest配置在package.json
https://gist.github.com/e00dd4ee41b06265632d3bcfe76e7cb0内
原始的i18n.js
https://gist.github.com/pavilion/3c48c6017a82356914f0ad69d7251496
嘲笑i18n.js
https://gist.github.com/pavilion/17e322340581fb948ed7e319ae4a5ac9(注意detect
内部的languageDetector
键已被手动模拟)
要测试的组件https://gist.github.com/pavilion/20dc0c5b1a6d2ee709b7a71ec7b819c1
utils.js https://gist.github.com/pavilion/1c5df0f71d50462d75234365ae1e4aaf
Comp.test.js https://gist.github.com/pavilion/2a84880bee3a99fa51fc3e28cfa8f913
错误:https://gist.github.com/pavilion/012ee0889ebbe2b93b2108d93543e19c
我认为问题不在于模拟,而在于导入!在注入模拟之后,尝试这次需要测试中的组件:
import React from 'react';
import { shallow } from 'enzyme';
jest.mock('../../config/i18n');
describe('<Comp />', () => {
it('must match the snapshot', () => {
// Require here instead of importing on top
const Comp = require("./Comp").default;
// state and props properly set up
const wrapper = shallow(<Comp />);
expect(wrapper).toMatchSnapshot();
});
});
我在本地尝试了这个并且工作正常:模块被嘲笑。我简化了很多我的例子,所以也许你遇到了一些新的错误,但从技术上讲,这应该可以解决你的问题。
编辑:推动我的工作示例到github here万一它是为了任何帮助。