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

时间:2017-12-14 11:56:22

标签: javascript unit-testing jestjs

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

我知道在Jest中有一个之前 - 我应该使用它吗?重置mock.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);
});

4 个答案:

答案 0 :(得分:35)

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

添加到Sum.test.js:

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

答案 1 :(得分:8)

正如@AlexEfremov在评论中指出的那样。您可能希望在每次测试后使用insert or update on table "posts" violates foreign key constraint "FK_d8feca7198a0931f8234dcc58d7" Key (user_id)=(1) is not present in table "users".

clearAllMocks

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

答案 2 :(得分:8)

您可以将Jest配置为在每次测试后重置模拟,方法是将其放入jest.config.js

module.exports = {
  resetMocks: true,
};

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

resetMocks [布尔]

默认:false

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

答案 3 :(得分:1)

您可以在命令中添加 --resetMocks 选项: npx jest --resetMocks

<块引用>

在每次测试之间自动重置模拟状态。相当于 调用 jest.resetAllMocks()