如何在react native中使用jest模拟命名的导入对象类型const ?



大家好,我目前正在使用以下库

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将永远被模拟一次,而您可能想要测试它的不同变体。也许doMockunmock可以帮助克服这个问题,但在我看来,更可靠的是创建几个.test.js文件,每个文件都将以独特的方式模拟BiometryTypes(例如:FaceID_and_TouchID.test.js,TouchID-only.test.js等)。jest.mock是非常神奇的,因为它被提升到顶部,使用unmock/doMock可能会打破如果值已经被其他模块或闭包捕获在同一模块。

最新更新