Unit testing React Native:Jest mocking平台

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时,

在为React原生项目编写单元测试时,我希望能够基于不同的平台测试不同的快照

我第一次尝试了从
jest.mock
到mock
Platform
,但似乎是异步的。当我有两个单独的文件时,这种方法确实有效,但如果可能的话,我更愿意将所有内容保存在一个文件中

我尝试了
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年,我认为这也是这个问题的最佳答案和最佳选择。