我正在尝试在排毒测试中模拟RNCamera。但是,模拟摄像机不会覆盖实际的实现。
我遵循了these instructions,并加入了建议from these posts。
结果是:
- 模拟摄像机类文件本身 已执行(打印了顶层日志)
- 模拟相机的takePictureAsync和渲染功能不称为
- 使用仿真器的默认摄像头
我也尝试过:
-
RN_SRC_EXT=e2e react-native run-android
,然后detox test
- 在最佳身体中添加
"test-runner": "jest" and calling
jest.mock` - 用
RN_SRC_EXT=e2e
代替RN_SRC_EXT=e2e.js
- 清理:
rm -rf node_modules; yarn install
等
我的应用布局就像(不包含与测试无关的内容)
package.json
:
{
...
"dependencies": {
...
"@types/jest": "^24.0.21","react": "16.9.0","react-dom": "latest","react-native": "0.61.1","react-native-camera": "^3.6.0",},"devDependencies": {
"@babel/core": "latest","@babel/preset-env": "latest","@babel/register": "latest","@babel/preset-react": "latest","@react-native-community/eslint-config": "^0.0.5","babel-jest": "^24.9.0","detox": "^14.5.1","jest": "^24.9.0","jest-fetch-mock": "^2.1.2","metro-react-native-babel-preset": "^0.56.0","mocha": "^6.2.2","react-test-renderer": "16.9.0"
},"detox": {
"configurations": {
"android.emu.debug": {
"binaryPath": "android/app/build/outputs/apk/debug/app-debug.apk","build": "RN_SRC_EXT=e2e cd android && ./gradlew assembleDebug assembleAndroidTest -DtestBuildType=debug && cd ..","type": "android.emulator","device": {
"avdName": "Pixel_2_API_29"
}
},"android.emu.release": {
"binaryPath": "android/app/build/outputs/apk/release/app-release.apk","build": "RN_SRC_EXT=e2e cd android && ./gradlew assembleRelease assembleAndroidTest -DtestBuildType=release && cd ..","device": {
"avdName": "Pixel_2_API_29"
}
}
}
}
}
e2e/config.js
:
require('@babel/register')({
//cache: true,presets: [require('metro-react-native-babel-preset')],plugins: [require('@babel/plugin-transform-runtime').default],only: ['./e2e','./js'],ignore: ['node_modules']
});
e2e/config.json
:
{
"setupFilesAfterEnv": ["./init.js"],"testEnvironment": "node","reporters": ["detox/runners/jest/streamlineReporter"],"testMatch": ["**/__tests__/**/*.js?(x)","**/?(*.)(e2e).js?(x)"],"verbose": true
}
e2e/mocha.opts
:
--recursive
--timeout 300000
--bail
--file e2e/init.js
--require e2e/config.js
--require e2e/config.json
--file e2e/react-native-camera.e2e.js
const defaultsourceExts = require('metro-config/src/defaults/defaults').sourceExts
module.exports = {
transformer: {
getTransformOptions: async () => ({
transform: {
experimentalImportSupport: false,inlineRequires: false,}),resolver: {
sourceExts: process.env.RN_SRC_EXT
? process.env.RN_SRC_EXT.split(',').concat(defaultsourceExts)
: defaultsourceExts
}
};
// printed as: module.exports.resolver from e2e { sourceExts: [ 'e2e','js','json','ts','tsx' ] }
console.log("module.exports from e2e",module.exports);
e2e/config.json
:
{
"setupFilesAfterEnv": ["./init.js"],// tried with and without this line
"testMatch": ["**/__tests__/**/*.js?(x)","verbose": true
}
test.spec.js
describe('Example',() => {
beforeEach(async () => {
await device.reloadReactNative();
});
it('should blah blah balh',async () => {
// test implementation
});
});
init.js
:
const detox = require('detox');
const config = require('../package.json').detox;
const adapter = require('detox/runners/mocha/adapter');
before(async () => {
await detox.init(config);
});
beforeEach(async function() {
await adapter.beforeEach(this);
});
afterEach(async function() {
await adapter.afterEach(this);
});
after(async () => {
await detox.cleanup();
});
e2e/react-native-camera.e2e.js
:(来自here)
import React from 'react';
const timeout = ms => new Promise(resolve => setTimeout(resolve,ms));
// This IS printed on detox test -c android.emu.debug.
console.log("executing react-native-camera-e2e.js");
export class RNCamera extends React.Component {
static Constants = {
Aspect: {},BarCodeType: {},Type: { back: 'back',front: 'front' },CaptureMode: {},Capturetarget: {},CaptureQuality: {},Orientation: {},flashMode: {},TorchMode: {},};
takePictureAsync = async () => {
console.log("mock RNCamera takePictureAsync"); // Never printed
await timeout(2000);
return { uri: './static-image.jpg' };
};
render() {
// This is never printed.
console.log("mock RNCamera render()");
return null;
}
}
export const takePictureAsync = async () => {
console.log("mock RNCamera takePictureAsync"); // never printed
await timeout(2000);
return { uri: './static-image.jpg' };
};
export default RNCamera;