You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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:

  1. 在项目根目录创建__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() }
        });
      },
    };
    
  2. 打开你的Detox测试入口(比如e2e/init.js),在最顶部加一行:
    jest.mock('@splitsoftware/splitio-react-native');
    
    这行必须写在所有导入Split.IO的代码前面,确保Mock先加载。

方法2:通过Jest配置指定Mock路径

如果__mocks__目录不好使,直接在Jest配置里硬指定:

  1. 先按方法1创建好Mock文件,然后在e2e目录下建jest.config.js:
    module.exports = {
      // 保留原来的Detox Jest配置
      moduleNameMapper: {
        '@splitsoftware/splitio-react-native': '<rootDir>/__mocks__/@splitsoftware/splitio-react-native.js'
      }
    };
    
  2. 修改package.json里的Detox启动脚本,指定用这个配置:
    {
      "scripts": {
        "detox:ios": "detox test -c ios.sim.debug --jest-config=e2e/jest.config.js"
      }
    }
    

方法3:运行时强制注入Mock(终极方案)

如果上面两种都不行,直接在Detox启动应用后手动替换SplitFactory:

  1. 在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() }
          });
        };
      });
    });
    
  2. 然后在你的应用代码里,判断测试环境用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 04:06:35