大家好,我目前正在使用以下库
https://www.npmjs.com/package/react-native-biometrics
为我的项目,但我在这里卡住了,当我试图为它写单元测试,我已经嘲笑库如下
import ReactNativeBiometrics, { BiometryTypes } from 'react-native-biometrics';
jest.mock ('react-native-biometrics', () =>
{
class ReactNativeBiometrics {
constructor(){
}
isSensorAvailable() {
}
}
return ReactNativeBiometrics;
});
现在我试着模仿
BiometryTypes
但它没有被嘲笑,任何人都可以给出一些如何被嘲笑的想法。
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 ('react-native-biometrics', () =>
{
class ReactNativeBiometrics {
......
}
return {
__esModule: true
default: ReactNativeBiometrics,
BiometryTypes: { TouchID: 'mock1', FaceID: 'mock2', .... } // static values
};
});
Jest文档解释了为什么这样做是必要的:
对于默认导出的ES6模块使用factory参数时,需要指定
导入名为__esModule: true
属性。这个属性通常是由Babel/TypeScript生成的,但这里需要手动设置。在导入默认导出时,从导出对象default
的属性是一条指令。
小心!使用这种方法,对象BiometryTypes
将永远被模拟一次,而您可能想要测试它的不同变体。也许doMock
和unmock
可以帮助克服这个问题,但在我看来,更可靠的是创建几个.test.js
文件,每个文件都将以独特的方式模拟BiometryTypes
(例如:FaceID_and_TouchID.test.js
,TouchID-only.test.js
等)。jest.mock
是非常神奇的,因为它被提升到顶部,使用unmock
/doMock
可能会打破如果值已经被其他模块或闭包捕获在同一模块。