是否可以使用此处提供的指南来模拟node_module:https://github.com/wix/Detox/blob/master/docs/Guide.Mocking.md
我能够模拟常规文件,但是节点模块也可以吗?如果是这样,我该怎么做?
要使用 detox 模拟第三方模块,您需要创建某种代理模块。然后您可以创建该文件的模拟版本,然后 detox 可以拾取该文件进行测试。
就我而言,我想模拟世博会跟踪透明度。
expo-tracking-transparency.ts
,它只是再次导出 expo-tracking-transparency 包本身导出的内容:export * from 'expo-tracking-transparency';
expo-tracking-transparency.mock.ts
,它模拟了我需要的功能:- src/helpers
|__ expo-tracking-transparency.ts
|__ expo-tracking-transparency.mock.ts
import { PermissionResponse, PermissionStatus } from 'expo-tracking-transparency';
const response: PermissionResponse = {
status: PermissionStatus.DENIED,
granted: false,
expires: 'never',
canAskAgain: true,
};
const requestTrackingPermissionsAsync = (): Promise<PermissionResponse> => Promise.resolve(response);
const getTrackingPermissionsAsync = (): Promise<PermissionResponse> => Promise.resolve(response);
export { requestTrackingPermissionsAsync, getTrackingPermissionsAsync };
--sourceExts
选项运行 Metro,在正常文件扩展名之前设置模拟扩展名像这样:react-native start --sourceExts mock.ts,mock.js,js,json,ts,tsx
Metro 运行后开始您的排毒测试,它应该会拾取您的模拟文件(如果存在)。
您可以在构建应用程序时通过简单地将目标模块的路径替换为您的模拟文件来模拟项目中的任何包。这种方法的优点是您不必更改实际代码。例如,如果您想模拟 codepush 包,您可以更改 Metro.config.js 文件:
const defaultResolver = require('metro-resolver').resolve;
// solution for Metro < 0.68
module.exports = {
resolver: {
resolveRequest: (context, moduleName, platform, realModuleName) => {
if (process.env.DETOX_TEST === 'true' && moduleName === 'react-native-code-push') {
return {
filePath: `${__dirname}/src/Codepush.mock.js`,
type: 'sourceFile'
};
}
return defaultResolver(
{
...context,
resolveRequest: null
},
moduleName,
platform,
realModuleName,
);
}
}
}