如何配置Detox在E2E测试中自动使用*e2e.js文件无需预构建RN应用
解决方案
要让Detox自动使用*.e2e.js桩文件,你需要确保Detox的构建流程正确注入环境变量并清理Metro缓存,同时配置Metro识别该扩展名。以下是分步操作:
1. 修改Detox配置的Build命令
你的Detox配置中已经在gradle命令前加入了RN_SRC_EXT=e2e.js,但缺少Metro缓存清理步骤,导致旧的JS打包缓存被复用。更新build字段,先清理缓存再执行构建:
"detox": { "configurations": { "android.emu.debug": { "binaryPath": "android/app/build/outputs/apk/debug/app-debug.apk", "build": "rm -rf $TMPDIR/metro-* && RN_SRC_EXT=e2e.js cd android && ./gradlew assembleDebug assembleAndroidTest -DtestBuildType=debug && cd ..", "type": "android.emulator", "name": "Android_Accelerated_Nougat" } } }
注:如果你用Windows系统,把
rm -rf $TMPDIR/metro-*替换为rm -rf %TEMP%\metro-*。
这个命令会先清除Metro的打包缓存,再让Gradle在RN_SRC_EXT=e2e.js环境下构建应用,确保Metro打包时优先加载*.e2e.js文件。
2. 配置Metro识别e2e扩展名(可选但更可靠)
修改项目根目录的metro.config.js,让Metro根据环境变量自动加载指定的扩展名:
const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config'); const defaultConfig = getDefaultConfig(__dirname); module.exports = mergeConfig(defaultConfig, { resolver: { // 当RN_SRC_EXT存在时,优先使用指定的扩展名,否则用默认列表 sourceExts: process.env.RN_SRC_EXT ? [...process.env.RN_SRC_EXT.split(','), ...defaultConfig.resolver.sourceExts] : defaultConfig.resolver.sourceExts, }, });
这样Metro会优先查找*.e2e.js文件,再回退到默认的扩展名文件,避免缓存或优先级问题。
3. 运行Detox测试
现在你只需要执行以下命令,Detox会自动完成带桩文件的构建和测试:
detox test -c android.emu.debug
不需要手动设置RN_SRC_EXT或重启Metro,因为构建流程已经包含了缓存清理和环境变量注入。
为什么之前的命令无效?
- 直接运行
RN_SRC_EXT=e2e.js detox test时,环境变量只作用于detox进程本身,而Gradle/Metro的子进程没有继承这个变量; - 你需要把
RN_SRC_EXT放在Detox的build命令中,确保Gradle调用Metro打包时能获取到这个变量; - Metro缓存会保留旧的打包产物,必须清理后才能加载新的
*.e2e.js文件。
内容的提问来源于stack exchange,提问作者Hirurg103
相关产品推荐
相关产品推荐

