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

Ale*_*mov 49 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;
  },
};
Run Code Online (Sandbox Code Playgroud)

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);
});
Run Code Online (Sandbox Code Playgroud)

Ale*_*mov 50

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

要添加到Sum.test.js:

afterEach(() => {
  local.getData.mockClear();
});
Run Code Online (Sandbox Code Playgroud)

  • 你试过使用`jest.clearAllMocks()`吗?文件:http://jestjs.io/docs/en/jest-object#jestclearallmocks (19认同)
  • 为了增强这个答案,我更新了“jest.config.js”属性“resetMocks: true”。 (3认同)
  • 很好奇是否有一种方法可以对所有模拟对象的方法执行此操作。当我尝试“local.mockClear()”时,它不起作用。 (2认同)
  • @AlexEfremov,非常感谢您的`jest.clearAllMocks()`函数!我一直在对“jest.mock”类使用“mockClear()”,显然这些模拟并没有完全清除(模拟类中的间谍函数调用没有被清除)。这导致了非常烦人的对象实例差异错误:“比较值没有视觉差异。”。 (2认同)

小智 18

jest.clearAllMocks()实际上并没有为我清除所有的嘲笑。

afterEach(() => {
    jest.restoreAllMocks();
}); 
Run Code Online (Sandbox Code Playgroud)

帮我终于清除了笑话中的间谍

  • 这对我没有帮助,但已经很接近了。我使用了`jest.clearAllMocks();` (2认同)
  • 正如马丁所说,正确的答案是“jest.clearAllMocks()” (2认同)

And*_*gin 17

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

module.exports = {
  resetMocks: true,
};
Run Code Online (Sandbox Code Playgroud)

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

resetMocks [布尔值]

默认值:假

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

  • 我在这里同意@Flux。配置[clearMocks](https://jestjs.io/docs/configuration#clearmocks-boolean)似乎是作者想要的。 (4认同)
  • 我对此不是 100% 确定,但这不会真正重置模拟。IE 重置了您拥有的任何模拟实现吗?如果您在实际测试之外设置模拟的实现,它将被重置(如果它相当于 ech 测试之前的 `resetAllMocks()` 。作者似乎正在寻找一种清除调用计数器的方法,但保留他们的模拟实现。同样,不是100%确定,但这是我对resetAllMocks的理解。 (3认同)

Dan*_*rín 8

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

afterEach(() => {
    jest.clearAllMocks();
});
Run Code Online (Sandbox Code Playgroud)

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