javascript - 如何解决 Jest Test Code mockRestore 不起作用的问题

标签 javascript unit-testing jestjs

我正在使用 Jest 进行客户端测试。 但我有一个问题。

当我将类方法替换为模拟函数并恢复模拟函数时, 我使用 Jest mockRestore 方法。 但它不起作用。

我该如何解决这个问题?

console.log(OriginalClass.call);

// it will result is here.
// console.log test/vue/plugins/swaggerClient.spec.js:46
//       [AsyncFunction: call]

OriginalClass.call = jest.fn().mockReturnValue(`test`);
OriginalClass.call.mockRestore();

console.log(OriginalClass.call);

// it will result is here.
// console.log test/vue/plugins/swaggerClient.spec.js:62
//       { [Function: mockConstructor]
//         _isMockFunction: true,
//         getMockImplementation: [Function],
//         mock: [Getter/Setter],
//         mockClear: [Function],
// ↑ I expect this that is [AsyncFunction: call]

最佳答案

来自文档:https://jestjs.io/docs/en/mock-function-api#mockfnmockrestore

Beware that mockFn.mockRestore only works when the mock was created with jest.spyOn.

所以,这是一个 TypeScript 解决方案。

要将其翻译成 JavaScript,请替换 (OriginalClass.call as jest.MockedFunction<typeof OriginalClass.call>)OriginalClass.call以及对 ts 的所有引用与 js .

OriginalClass.ts :

export class OriginalClass {
  public static call() {
    return 'real data';
  }

  public static testCall() {
    return this.call();
  }
}

单元测试:

OriginalClass.spec.ts

import { OriginalClass } from './OriginalClass';

describe('OriginalClass', () => {
  it('should mock correctly', () => {
    jest.spyOn(OriginalClass, 'call').mockReturnValue(`test`);
    const actualValue = OriginalClass.testCall();
    expect(actualValue).toBe('test');
    (OriginalClass.call as jest.MockedFunction<typeof OriginalClass.call>).mockRestore();
  });
  it('should restore to original implementation', () => {
    expect(jest.isMockFunction(OriginalClass.call)).toBeFalsy();
  });
});

单元测试结果:

PASS  src/stackoverflow/57410473/OriginalClass.spec.ts
  OriginalClass
    ✓ should mock correctly (7ms)
    ✓ should restore to original implementation (1ms)

Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        4.983s

这是完整的 TypeScript 演示 here .

关于javascript - 如何解决 Jest Test Code mockRestore 不起作用的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57410473/

相关文章:

javascript - Undefined 不是一个对象(评估 'value.phrase.replace' )

javascript - 如何在 Canvas 对象保持在同一位置的同时旋转该对象

javascript - 将事件处理程序绑定(bind)到 HTML select.option

javascript - 将数组和其他变量一起转换成 JSON

javascript - AngularJS 输入类型 = 监视变化的数字的指令

c# - 单元测试内存泄漏

javascript - 为创建 Json REST 服务的模块编写单元测试

javascript - 使用 jest 模拟 moment() 和 moment().format

javascript - 针对已编译的包运行测试

jestjs - 类型错误 : Cannot read property 'LENGTH_LONG' of undefined