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

2022-08-30 01:42:36

我是Jest的新手,我试图用它来测试一个函数是否被调用。我注意到 mock.calls.length 不是为每个测试重置,而是在累积。如何在每次测试前将其设置为 0?我不希望我的下一个测试取决于上一个测试的结果。

我知道在开玩笑之前有Each - 我应该使用它吗?重置 mock.calls.length 的最佳方法是什么?谢谢。

代码示例:

总和.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);
});

答案 1

我发现了一种处理它的方法:在每次测试后清除模拟函数:

要添加到 Sum.test.js:

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

如果要在每次测试后清除所有模拟函数,请使用 clearAllMocks

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

答案 2

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

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

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