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

k10s72fa  于 2023-01-02  发布在  React
关注(0)|答案(1)|浏览(126)

大家好,我现在正在使用以下库
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

但它没有被嘲笑,任何人都可以给予一些想法,这是如何可以被嘲笑。
导出生物测定类型,如下所示

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
};
svgewumm

svgewumm1#

您可以在工厂函数中合并命名模拟和默认模拟:

jest.mock ('react-native-biometrics', () =>
{
  class ReactNativeBiometrics {
     ......
  }
  return { 
    __esModule: true
    default: ReactNativeBiometrics,
    BiometryTypes: { TouchID: 'mock1', FaceID: 'mock2', .... } // static values
  };
});

Jest文档阐明了为什么需要这样做:
ES6模块使用工厂参数默认导出时,需要指定__esModule: true属性,该属性一般由Babel / TypeScript生成,这里需要手工设置,导入默认导出时,是从导出对象中导入名为default的属性的指令
注意!使用这种方法,对象BiometryTypes将被永远地模仿,而您可能希望测试它的不同变体。也许doMockunmock可以帮助克服这个问题,但在我看来,更可靠的是创建几个.test.js文件,每个文件都将以独特的方式模仿BiometryTypes(例如FaceID_and_TouchID.test.jsTouchID-only.test.js等)。jest.mock非常神奇,因为它被提升到最顶端,如果值已经被其他模块或同一模块中的闭包捕获,使用unmock/doMock可能会中断。

相关问题