You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Jest同时Mock react-native-camera的Camera与RNCamera组件?

如何同时Mock React Native Camera中的Camera和RNCamera组件?

我刚处理过类似的问题,核心原因是你之前的mock只覆盖了react-native-camera包的默认导出(也就是Android端的Camera),但没有处理iOS端的RNCamera这个命名导出。下面是具体的解决步骤:

1. 修改Mock文件,同时导出两个组件

更新你的__mocks__/react-native-camera.js文件,同时定义Camera和RNCamera的mock类,并确保两者的常量结构和你业务代码中的使用方式一致:

import React from 'react';

// 定义通用的常量结构(根据你的需求补充具体值)
const cameraConstants = {
  Aspect: {},
  BarCodeType: {},
  Type: {},
  CaptureMode: {},
  CaptureTarget: {},
  CaptureQuality: {},
  Orientation: {},
  FlashMode: {},
  TorchMode: {}
};

// Android端Camera的mock
class Camera extends React.Component {
  static constants = cameraConstants;
  render() { return null; }
}
Camera.constants = cameraConstants;

// iOS端RNCamera的mock(注意常量是大写的Constants,和Camera区分开)
class RNCamera extends React.Component {
  static Constants = { Type: {} };
  render() { return null; }
}
RNCamera.Constants = { Type: {} };

// 同时导出默认的Camera和命名导出的RNCamera
export default Camera;
export { RNCamera };

2. 保持测试文件的Mock调用不变

你原来的jest.mock语句不需要修改,因为它已经指向了更新后的mock文件:

jest.mock('react-native-camera', () => require.requireActual('../../__mocks__/react-native-camera').default);

现在当你的业务代码中同时导入两个组件时:

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

Jest会正确提供两个mock组件,再也不会出现RNCamera未定义的问题。

3. 可选:添加测试验证Mock生效

你可以在测试用例中加入简单的断言,确认mock是否正常工作:

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

test('Camera和RNCamera的mock已正确加载', () => {
  expect(Camera).toBeDefined();
  expect(RNCamera).toBeDefined();
  expect(Camera.constants.Type).toBeDefined();
  expect(RNCamera.Constants.Type).toBeDefined();
});

内容的提问来源于stack exchange,提问作者Socratease

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:06:27