如何在React Native中用Jest模拟具名导入的BiometryTypes常量
解决react-native-biometrics中BiometryTypes的Jest模拟问题
我在项目中使用react-native-biometrics库编写单元测试时,已经成功模拟了库的核心类,但始终无法正确模拟导出的BiometryTypes常量。
当前问题场景
原模拟代码仅覆盖了ReactNativeBiometrics类:
import ReactNativeBiometrics, { BiometryTypes } from 'react-native-biometrics'; jest.mock('react-native-biometrics', () => { class ReactNativeBiometrics { constructor(){} isSensorAvailable() {} } return ReactNativeBiometrics; });
BiometryTypes的实际导出是一个包含三个字符串常量的对象:
export declare const BiometryTypes: { TouchID: string; FaceID: string; Biometrics: string; };
我曾尝试直接修改导入的模块对象,但没有效果:
import { BiometryTypes } from 'react-native-biometrics'; import * as all from 'react-native-biometrics'; const TouchID = 'TouchID'; all.BiometryTypes = { TouchID: TouchID, FaceID: TouchID };
正确的模拟方案
要同时模拟类和命名导出的常量,需要在jest.mock的返回对象中同时包含默认导出(类)和命名导出(BiometryTypes),并且标记为ES模块:
import ReactNativeBiometrics, { BiometryTypes } from 'react-native-biometrics'; jest.mock('react-native-biometrics', () => { // 模拟ReactNativeBiometrics类及方法 class MockReactNativeBiometrics { constructor() {} isSensorAvailable() { // 可根据测试需求返回自定义模拟结果 return Promise.resolve({ available: true, biometryType: BiometryTypes.TouchID }); } // 其他需要测试的方法也可在此添加模拟逻辑 } // 模拟BiometryTypes常量对象 const MockBiometryTypes = { TouchID: 'TouchID', FaceID: 'FaceID', Biometrics: 'Biometrics' }; // 返回包含所有导出的对象,__esModule标记确保ES模块解析正常 return { __esModule: true, default: MockReactNativeBiometrics, BiometryTypes: MockBiometryTypes }; });
关键要点
- __esModule标记:必须添加这个属性,Jest才能正确识别ES模块的导出结构,确保命名导出的BiometryTypes能被正确导入。
- 同时覆盖类和常量:返回对象中要同时提供
default(对应原库的默认导出类)和BiometryTypes(模拟的常量对象),这样两种导入方式都能获取到模拟值。 - 方法模拟的一致性:在模拟类的方法时,可以直接使用模拟的BiometryTypes常量,保证测试逻辑的统一性。
内容的提问来源于stack exchange,提问作者Hrusikesh
相关产品推荐
相关产品推荐

