Unit testing React Native:Jest mocking平台
在为React原生项目编写单元测试时,我希望能够基于不同的平台测试不同的快照 我第一次尝试了从Unit testing React Native:Jest mocking平台,unit-testing,react-native,jestjs,snapshot,babel-jest,Unit Testing,React Native,Jestjs,Snapshot,Babel Jest,在为React原生项目编写单元测试时,我希望能够基于不同的平台测试不同的快照 我第一次尝试了从jest.mock到mockPlatform,但似乎是异步的。当我有两个单独的文件时,这种方法确实有效,但如果可能的话,我更愿意将所有内容保存在一个文件中 我尝试了jest.doMock,因为文档中有这样一段代码: 使用BabelJest时,对mock的调用将自动提升到代码块的顶部。如果要显式避免此行为,请使用此方法。 然而,我仍然看到不理想的结果。当我在android测试中console.log时,
jest.mock
到mockPlatform
,但似乎是异步的。当我有两个单独的文件时,这种方法确实有效,但如果可能的话,我更愿意将所有内容保存在一个文件中
我尝试了jest.doMock
,因为文档中有这样一段代码:
使用BabelJest时,对mock的调用将自动提升到代码块的顶部。如果要显式避免此行为,请使用此方法。
然而,我仍然看到不理想的结果。当我在android测试中console.log
时,我看到Platform.OS
是我设置的第一个doMock
的内容
我还尝试在每次之前将模拟包在中在描述中,因为我认为这可能有助于确定范围
description('ios测试',()=>{
它('正确呈现ui',()=>{
jest.doMock('Platform',()=>{
const Platform=require.requireActual(‘平台’);
Platform.OS='ios';
返回平台;
});
常量包装器=浅();
const tree=renderer.create(wrapper.toJSON();
expect(tree.toMatchSnapshot();
});
});
描述('android测试',()=>{
它('正确呈现ui',()=>{
jest.doMock('Platform',()=>{
const Platform=require.requireActual(‘平台’);
Platform.OS='android';
返回平台;
});
常量包装器=浅();
const tree=renderer.create(wrapper.toJSON();
expect(tree.toMatchSnapshot();
});
});
关于如何在同一个文件中更改模拟平台以进行测试,有什么想法吗?关于如何在中解决此问题,有很多建议,但考虑到您的相同要求(在同一个套件文件和一次测试运行中对不同的操作系统进行测试),这些建议对我都不起作用
我最终使用了一个有点笨重的辅助函数来解决这个问题,该函数可以在测试中按预期进行模拟,比如:
导出函数getOS(){
returnplatform.OS;
}
在代码中使用它而不是Platform.OS
,然后在测试中简单地模拟它,例如
it('在Android上做点什么',()=>{
helpers.getOS=jest.fn().mockImplementationOnce(()=>'android');
// ...
}
这就成功了;这个想法的功劳在于。任何人在流量方面有问题:使用jest.requireActual
而不是require.requireActual
,即使在2021年,我认为这也是这个问题的最佳答案和最佳选择。