【问题标题】:how to mock react-native-camera with jest?如何用 jest 模拟 react-native-camera?
【发布时间】:2017-06-08 06:22:21
【问题描述】:

我正在尝试使用jest 测试react-native-camera 模块

所以我有以下package.json

{
  "name": "app",
  "version": "0.0.1",
  "private": true,
  "main": "index.js",
  "license": "MIT",
  "scripts": {
    "start": "node node_modules/react-native/local-cli/cli.js start",
    "test": "jest"
  },
  "dependencies": {
    "react": "~15.4.0-rc.4",
    "react-native": "0.40.0",
    "react-native-camera": "^0.5.1"
  },
  "devDependencies": {
    "babel-eslint": "^7.1.1",
    "babel-jest": "18.0.0",
    "babel-preset-react-native": "1.9.1",
    "jest": "18.1.0",
    "react-test-renderer": "~15.4.0-rc.4"
  },
  "jest": {
    "preset": "react-native"
  }
}

并在example 中给出以下Component

import React from 'react';
import Camera from 'react-native-camera';

class CameraComponent extends React.Component {
  constructor(props: Props) {
    super(props);

    this.camera = null;

    this.state = {
      camera: {
        aspect: Camera.constants.Aspect.stretch,
        captureTarget: Camera.constants.CaptureTarget.cameraRoll,
        type: Camera.constants.Type.back,
        orientation: Camera.constants.Orientation.auto,
        flashMode: Camera.constants.FlashMode.auto,
      }
    };
  }

  render() {
    return (
        <Camera
          ref={(cam) => {
            this.camera = cam;
          }}
          style={styles.preview}
          aspect={this.state.camera.aspect}
          captureTarget={this.state.camera.captureTarget}
          type={this.state.camera.type}
          flashMode={this.state.camera.flashMode}
          defaultTouchToFocus
          mirrorImage={false}
        />
    );
  }
}

const styles = StyleSheet.create({
  preview: {
    flex: 1
  }
}

所以下面的测试失败并显示以下消息:

TypeError: 无法读取未定义的属性“方面”

import 'react-native';
import React from 'react';
import Index from '../index.ios.js';

import renderer from 'react-test-renderer';

it('renders correctly', () => {
  const tree = renderer.create(
    <Index />
  );
});

【问题讨论】:

    标签: javascript reactjs react-native jestjs react-native-camera


    【解决方案1】:

    修复 __mocks__ 文件夹中创建的 react-native-camera 反应组件:

    import React from 'react';
    
    const constants = constants = {
      Aspect: {},
      BarCodeType: {},
      Type: {},
      CaptureMode: {},
      CaptureTarget: {},
      CaptureQuality: {},
      Orientation: {},
      FlashMode: {},
      TorchMode: {}
    };
    
    class Camera extends React.Component {
    
      static constants = constants
      render() {
        return null;
      }
    }
    
    Camera.constants = constants;
    
    export default Camera;
    

    并通过添加以下行来修改测试:

    import mockCamera from '../__mocks__/Camera';
    
    jest.mock('react-native-camera', () => mockCamera);
    

    【讨论】:

      【解决方案2】:

      你必须像这样使用库的名称和组件的名称来模拟它:

      jest.mock('react-native-camera', () =&gt; 'Camera');

      更多信息在这里:https://facebook.github.io/jest/docs/tutorial-react-native.html#tips

      【讨论】:

      • 谢谢,但我担心不是这样,我遇到了同样的错误。
      • 您是否也将其导入到您的测试中? import Camera from 'react-native-camera';
      • 是的,但看起来他们需要在构造函数中使用constant
      • 重点是mock而不是返回一个字符串需要返回一个像这样的对象:{constants: {Aspect: ....}}
      猜你喜欢
      • 2019-11-02
      • 1970-01-01
      • 2018-05-05
      • 2021-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-09
      • 2019-10-08
      相关资源
      最近更新 更多