如何使用Jest模拟React Native相机?

7
我正在尝试使用react-native-camera模块和jest进行测试。
因此,我有以下的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
  }
}

以下测试未通过,出现以下错误信息:

类型错误:无法读取未定义的“Aspect”属性

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 />
  );
});
2个回答

8
为了解决这个问题,需要在__mocks__文件夹中创建一个react-native-camera的react组件。
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);

3

谢谢,但恐怕不是这样,我还是得到了相同的错误。 - locropulenton
你也将它导入到你的测试中了吗?import Camera from 'react-native-camera'; - Matt Aft
是的,但看起来他们需要在构造函数中使用“常量”。 - locropulenton
关键是模拟对象需要返回一个像这样的对象,而不是返回一个字符串:{constants: {Aspect: ....}} - Andreas Köberle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接