如何为 Jest 正确模拟 i18n
How to correctly mock i18n for Jest
我在 react-native 中有一个容器,它正在导入我们通常存储在 utils
目录中的典型函数,例如 capitaliseWord()
或其他目录。
utils
模块的其中一个函数使用了 t
,因此我们在 utils
文件夹中导入 i18n
以便能够使用 [=13] =]
我们在 i18n
中使用 languageDetector
来检测用户的移动语言。因为 languageDetector
需要 deviceLocale
(例如英国、美国、荷兰等),而 Jest 运行 在不同的上下文中,如果我尝试测试容器,我会得到 Cannot read property 'deviceLocale' of undefined
.
所以我创建了一个手动 __mocks__
目录(如 https://jestjs.io/docs/en/manual-mocks#mocking-user-modules 所述)并且我创建了我自己的 i18n
只是手动注入 deviceLocale
字符串,以便能够 运行 测试。
原来测试忽略了 __mocks__/i18n
并直接指向原始的...有什么可能出错的想法吗?
还有我的笑话配置 package.json
https://gist.github.com/e00dd4ee41b06265632d3bcfe76e7cb0
原创i18n.js
https://gist.github.com/pavilion/3c48c6017a82356914f0ad69d7251496
嘲笑i18n.js
https://gist.github.com/pavilion/17e322340581fb948ed7e319ae4a5ac9(注意 languageDetector
中的 detect
键已被手动模拟)
要测试的组件
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 以防有任何帮助。
我在 react-native 中有一个容器,它正在导入我们通常存储在 utils
目录中的典型函数,例如 capitaliseWord()
或其他目录。
utils
模块的其中一个函数使用了 t
,因此我们在 utils
文件夹中导入 i18n
以便能够使用 [=13] =]
我们在 i18n
中使用 languageDetector
来检测用户的移动语言。因为 languageDetector
需要 deviceLocale
(例如英国、美国、荷兰等),而 Jest 运行 在不同的上下文中,如果我尝试测试容器,我会得到 Cannot read property 'deviceLocale' of undefined
.
所以我创建了一个手动 __mocks__
目录(如 https://jestjs.io/docs/en/manual-mocks#mocking-user-modules 所述)并且我创建了我自己的 i18n
只是手动注入 deviceLocale
字符串,以便能够 运行 测试。
原来测试忽略了 __mocks__/i18n
并直接指向原始的...有什么可能出错的想法吗?
还有我的笑话配置 package.json
https://gist.github.com/e00dd4ee41b06265632d3bcfe76e7cb0
原创i18n.js
https://gist.github.com/pavilion/3c48c6017a82356914f0ad69d7251496
嘲笑i18n.js
https://gist.github.com/pavilion/17e322340581fb948ed7e319ae4a5ac9(注意 languageDetector
中的 detect
键已被手动模拟)
要测试的组件 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 以防有任何帮助。