繁体   English   中英

如何使用 jest 和 typscript 模拟模块变量

How to mock a module variable with jest and typscript

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有一个地图定义了一些这样的转换函数

export const transformFuncMap: { [key: string]: (args: TransformFunctionArgs) => Promise<any> } = {
    [TransformationType.UNZIP]: unzipArchiveAndUploadToS3,
    // tslint:disable-next-line: no-empty
    [TransformationType.NOOP]: async () => {},
};

后来在同一个模块中,我有一个句柄函数,它根据我提供的一些 seq 调用这些函数。

function handle(funcKeys: TransformationType[]) {
   for(const funcKey of funcKey) {
       await transformFuncMap[funcKey](); 
   }
}

当单元测试处理。 我只关心一些函数是按照我提供的顺序调用的。 我不想运行函数实现。

无论如何,是否可以开玩笑地用这样的东西来模拟transformFuncMap

export const transformFuncMap: { [key: string]: (args: TransformFunctionArgs) => Promise<any> } = {
    [TransformationType.UNZIP]:jest.fn(),
    // tslint:disable-next-line: no-empty
    [TransformationType.NOOP]: jest.fn(),
};

我希望能够做到这一点,而无需在参数中使用某种 Java 风格的依赖注入。

1 个回复

您可以使用jest.fn()替换transformFuncMap的原始方法/函数。

index.ts

const unzipArchiveAndUploadToS3 = async () => null;

type TransformFunctionArgs = any;
export enum TransformationType {
  UNZIP = 'UNZIP',
  NOOP = 'NOOP',
}

export const transformFuncMap: { [key: string]: (args: TransformFunctionArgs) => Promise<any> } = {
  [TransformationType.UNZIP]: unzipArchiveAndUploadToS3,
  // tslint:disable-next-line: no-empty
  [TransformationType.NOOP]: async () => {},
};

export async function handle(funcKeys: TransformationType[]) {
  for (const funcKey of funcKeys) {
    const args = {};
    await transformFuncMap[funcKey](args);
  }
}

index.spec.ts

import { handle, transformFuncMap, TransformationType } from './';

describe('59383743', () => {
  it('should pass', async () => {
    transformFuncMap[TransformationType.UNZIP] = jest.fn();
    transformFuncMap[TransformationType.NOOP] = jest.fn();
    const funcKeys: TransformationType[] = [TransformationType.NOOP, TransformationType.UNZIP];
    await handle(funcKeys);
    expect(transformFuncMap[TransformationType.UNZIP]).toBeCalledWith({});
    expect(transformFuncMap[TransformationType.NOOP]).toBeCalledWith({});
  });
});

带有覆盖率报告的单元测试结果:

 PASS  src/stackoverflow/59383743/index.spec.ts
  59383743
    ✓ should pass (7ms)

----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |    84.62 |      100 |       50 |       90 |                   |
 index.ts |    84.62 |      100 |       50 |       90 |                12 |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        4.626s, estimated 10s

源代码: https : //github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/59383743

1 用Jest模拟模块变量

我一直在使用Jest来模拟一些变量,这些变量用在经过测试的函数中,如下所示: 在这里, SERVER_URL的新设置值由hydrateApp() 。 但是,我不能使用module来做到这一点。 当我尝试设置module.hot时,在调用该函数时它将仍然是未定义的: 在这种情况 ...

3 使用 jest 时如何模拟模块

我在 vuejs2 项目中使用 Jest 进行单元测试,但被困在模拟 howler.js 中,这是一个导入到我的组件中的库。 假设我有一个名为Player.vue的组件 然后我有一个名为Player.spec.js测试文件。 测试代码是根据此处的答案编写的,但由于called未设置为 true ...

5 如何使用 Jest 模拟模拟模块的方法?

我正在尝试使用 jest 模拟 electron 模块中的“对话框”并遇到以下问题。 当直接在 object 上设置模拟时,它正在工作(案例 1)。 但是,当将模拟 function 存储在变量中并在模拟 object 中设置该变量时失败(案例 2)。 任何输入为什么会这样? 一般来说,我是 je ...

7 如何使用 jest 模拟私有变量

我正在尝试为 function 编写一个单元测试,如下所示: 为了测试这段代码,我需要模拟服务,因为它在 class 之外调用 function ,但问题是它是私有的。 我究竟如何用玩笑来模拟一个私有变量? class 创建它自己的实例,所以甚至可以模拟出来吗? ...

9 使用 Jest.js 模拟复杂模块

这是我想要模拟的模块的样子: 这是我要测试的TheModule用法: 这是我的测试: 当我运行这个测试时,我得到TypeError: Cannot read property 'someMethod' of undefined 是否可以在不更改TheModule实现的情况下模拟此模块? ...

10 Mocking 使用 Jest 的同一模块的不同值

我试图用 jest 测试一个反应组件,我是测试新手,所以请原谅任何错误。 我多次使用不同的值遵循这个解决方案 Jest 模拟模块,但问题是我有不同的组件结构。 代码: test.tsx 代码: Account.tsx 谁能告诉我如何开玩笑地使用渲染来运行这个场景。 在将其作为单个返回组件运行链接的问 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM