在iOS Detox中配置Split.IO React Native Jest Mock解决网络超时
在iOS Detox中搞定Split.IO React Native的Jest Mock配置
为啥之前的Mock没生效?
Detox的初始化流程和Jest的模块加载顺序不对路——直接把Mock代码扔detox init.js里,Jest的模块拦截机制根本没机会生效;至于.mock.ts没被读取,大概率是Metro配置没把Mock目录纳入构建,或者测试入口没正确触发Mock加载。
下面给几个实测有效的配置方法:
方法1:用Jest自动识别的__mocks__目录
这是最省心的方式,Jest会自动加载对应路径下的Mock:
- 在项目根目录创建
__mocks__/@splitsoftware/splitio-react-native.js文件,内容如下:const splitio = jest.requireActual('@splitsoftware/splitio-react-native'); module.exports = { ...splitio, SplitFactory: () => { return splitio.SplitFactory({ core: { authorizationKey: 'localhost' }, // 这里填测试需要的Split规则,比如 'my_feature': 'on' features: {}, sync: { localhostMode: splitio.LocalhostFromObject() } }); }, }; - 打开你的Detox测试入口(比如
e2e/init.js),在最顶部加一行:
这行必须写在所有导入Split.IO的代码前面,确保Mock先加载。jest.mock('@splitsoftware/splitio-react-native');
方法2:通过Jest配置指定Mock路径
如果__mocks__目录不好使,直接在Jest配置里硬指定:
- 先按方法1创建好Mock文件,然后在
e2e目录下建jest.config.js:module.exports = { // 保留原来的Detox Jest配置 moduleNameMapper: { '@splitsoftware/splitio-react-native': '<rootDir>/__mocks__/@splitsoftware/splitio-react-native.js' } }; - 修改
package.json里的Detox启动脚本,指定用这个配置:{ "scripts": { "detox:ios": "detox test -c ios.sim.debug --jest-config=e2e/jest.config.js" } }
方法3:运行时强制注入Mock(终极方案)
如果上面两种都不行,直接在Detox启动应用后手动替换SplitFactory:
- 在
e2e/init.js的beforeAll钩子中加这段:beforeAll(async () => { await device.launchApp({ newInstance: true, launchArgs: { isDetoxTest: true } // 给应用传个测试标记 }); // 直接在应用运行时替换SplitFactory await device.executeScript(() => { const splitio = require('@splitsoftware/splitio-react-native'); global.SplitFactory = () => { return splitio.SplitFactory({ core: { authorizationKey: 'localhost' }, features: {}, sync: { localhostMode: splitio.LocalhostFromObject() } }); }; }); }); - 然后在你的应用代码里,判断测试环境用Mock:
// 应用初始化Split的地方 let splitFactory; if (global.isDetoxTest) { splitFactory = global.SplitFactory(); } else { splitFactory = SplitFactory({ /* 你的正常配置 */ }); }
踩坑提醒
- Mock文件的路径必须和包名完全对应,比如
@splitsoftware/splitio-react-native的Mock就得放在__mocks__/@splitsoftware/splitio-react-native.js - 别让Metro把Mock文件排除了,检查
metro.config.js里的blacklistRE或blockList,确保没挡住Mock目录 - 绝对别在应用代码里硬写销毁SplitFactory的逻辑,用环境变量或启动参数区分测试环境才是正道
内容的提问来源于stack exchange,提问作者shawleigh17
相关产品推荐
相关产品推荐

