如何用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
相关产品推荐
相关产品推荐

