用排毒​​模拟RNCamera不起作用,称为非模拟impl

我正在尝试在排毒测试中模拟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

metro.config.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;
fengziyun 回答:用排毒​​模拟RNCamera不起作用,称为非模拟impl

用排毒嘲笑和用玩笑嘲笑是两件事。

为了能够使用排毒模拟第三方模块,您可以创建一个代理组件提供程序,该提供程序将决定要使用的组件。这样您就可以加载模拟版本以进行排毒测试。

在您的情况下,您可以创建一个CameraProvider.js,它将仅导出实际的RNCamera:

export { RNCamera } from 'react-native-camera';

然后,您需要在上一个文件旁边创建模拟版本CameraProvider.e2e.js,以便使用排毒进行端到端测试:

import React from 'react';

const timeout = ms => new Promise(resolve => setTimeout(resolve,ms));

export class RNCamera extends React.Component {
    static Constants = {
        Aspect: {},BarCodeType: {},Type: { back: 'back',front: 'front' },CaptureMode: {},CaptureTarget: {},CaptureQuality: {},Orientation: {},FlashMode: {},TorchMode: {},AutoFocus: { on: {} },WhiteBalance: { auto: {} },};

    takePictureAsync = async () => {
        console.log('mock RNCamera takePictureAsync');
        await timeout(2000);
        return { uri: './static-image.jpg' };
    };

    render() {
        console.log('mock RNCamera render()');
        return null;
    }
}

最后,如果您在自己的本地项目的根文件夹中有correctly configured个Metro捆绑器,则应该能够使用RN_SRC_EXT = e2e构建应用或启动捆绑器(用于调试目标) .js env变量,让Metro Bundle知道应该替换哪些文件扩展名。

,

Gomino的答案是正确的,但缺少答案,您需要从受测代码中的代理组件导入。

E.G。在您的组件中执行此操作:

import { RNCamera } from '../proxies/RNCamera'; 

并且不是

import { RNCamera } from 'react-native-camera';

然后,您需要确保使用RN_SRC_EXT = e2e.js env变量启动捆绑程序。所以我的排毒测试脚本(在package.json中)看起来像这样:

"start-detox-metro": "RN_SRC_EXT=e2e.js react-native start","detox-build": "detox build --configuration android.emu.debug","detox test": "detox test --configuration android.emu.debug --reuse",

按此顺序运行脚本。

都市捆绑器将代替原始代理文件处理.e2e.js文件的交换(但仅当设置了env var“ RN_SRC_EXT = e2e.js”时)。

本文链接:https://www.f2er.com/3157656.html

大家都在问