如何在每次测试之前重置Jest模拟功能调用计数


81

我是Jest的新手,我正在尝试将其用于测试是否调用了函数。我注意到对ock.calls.length来说并不是每次测试都会重置,而是不断积累。每次测试前如何将其设置为0?我不希望我的下一个测试取决于上一个的结果。

我知道Jest中有beforeEach-我应该使用它吗?重置模拟的最佳方法是什么?calls.length?谢谢。

一个代码示例:

Sum.js:

import local from 'api/local';

export default {
  addNumbers(a, b) {
    if (a + b <= 10) {
      local.getData();
    }
    return a + b;
  },
};

Sum.test.js

import sum from 'api/sum';
import local from 'api/local';
jest.mock('api/local');

// For current implementation, there is a difference 
// if I put test 1 before test 2. I want it to be no difference

// test 1
test('should not to call local if sum is more than 10', () => {
  expect(sum.addNumbers(5, 10)).toBe(15);
  expect(local.getData.mock.calls.length).toBe(0);
});

// test 2
test('should call local if sum <= 10', () => {
  expect(sum.addNumbers(1, 4)).toBe(5);
  expect(local.getData.mock.calls.length).toBe(1);
});

Answers:


130

我发现处理它的一种方法:每次测试后清除模拟功能:

要添加到Sum.test.js:

afterEach(() => {
  local.getData.mockClear();
});

如果您想在每次测试后清除所有模拟功能,请使用clearAllMocks

afterEach(() => {
  jest.clearAllMocks();
});

好奇是否有一种方法可以对所有模拟对象的方法进行处理。当我尝试local.mockClear()时不起作用。
公民conn

27
您尝试过使用jest.clearAllMocks()吗?文件:jestjs.io/docs/zh/jest-object#jestclearallmocks
Alex Efremov

@AlexEfremov,非常感谢您的jest.clearAllMocks()功能!我已经使用mockClear()jest.mock类和显然嘲笑并没有完全清除某种方式(模拟类中的间谍函数调用不清零)。这导致了真正令人讨厌的对象实例差异错误:Compared values have no visual difference.
Patrick

20

正如@AlexEfremov在评论中指出的那样。您可能希望clearAllMocks在每次测试后使用:

afterEach(() => {
    jest.clearAllMocks();
});

请记住,这将清除您拥有的每个模拟函数的调用计数,但这可能是正确的方法。


8

您可以将Jest配置为在每次测试后将模拟重置为jest.config.js

module.exports = {
  resetMocks: true,
};

这是此配置参数的文档:https : //jestjs.io/docs/en/configuration#resetmocks-boolean

resetMocks [布尔值]

默认值:false

每次测试前自动重置模拟状态。等同于在每次测试之前调用jest.resetAllMocks()。这将导致任何模拟都删除其假实现,但不会恢复其初始实现。


3
谢谢!为什么这不是默认设置确实让我感到困惑...
Randomor
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.