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

byqmnocz  于 2022-12-31  发布在  Jest
关注(0)|答案(6)|浏览(259)

我试着用它来测试一个函数是否被调用。我注意到mock.calls.length不是在每次测试时都重置,而是在累积。我怎么能在每次测试前都把它设为0呢?我不希望我的下一次测试依赖于前一次的结果。
我知道在Jest中有beforeEach-我应该使用它吗?重置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);
});
zpgglvta

zpgglvta1#

我找到了一个解决办法:每次测试后清除模拟功能:
要添加到Sum.test.js:

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

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

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

sshcrbum2#

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

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

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

6ljaweal

6ljaweal3#

您可以配置Jest在每次测试后重置或清除模拟,方法是将以下参数之一放入jest.config.js

module.exports = {
  resetMocks: true,
};

module.exports = {
  clearMocks: true,
};

以下是文档:
https://jestjs.io/docs/en/configuration#resetmocks-boolean
resetMocks [布尔值]
默认值:false
在每次测试前自动重置模拟状态。相当于在每次测试前调用jest. resetAllMocks()。这将导致所有模拟的伪实现被删除,但不会恢复其初始实现。
https://jestjs.io/docs/configuration#clearmocks-boolean
clearMocks [布尔值]
默认值:false
在每次测试前自动清除模拟调用、示例和结果。等效于在每次测试前调用jest. clearAllMocks()。这不会删除任何可能已经提供的模拟实现。

ltqd579y

ltqd579y4#

jest.clearAllMocks();实际上没有为我清除所有的模拟。

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

帮我最终清除了那个间谍的玩笑

3ks5zfa0

3ks5zfa05#

每次测试后清除单独的模拟函数,(这可能对点击此网址的人有用)

import { methodName } from '../Path-to-file-with-methodName';

methodName.mockReturnValue(null );

    describe('my component', ()=> {
      afterEach(() => {
        methodName.mockClear();
      });
      
      it('should call my method on mount', () => {
        const wrapper = mount(<AComponent  {...props} />);
        expect(methodName).toHaveBeenCalledTimes(1);
      })
      it('should call my method on mount again', () => {
        const wrapper = mount(<AComponent  {...props} />);
        expect(methodName).toHaveBeenCalledTimes(1);
      })
    });
4dbbbstv

4dbbbstv6#

您可以将--resetMocks选项添加到命令中:第一个月
在每次测试之间自动重置模拟状态。等效于调用jest.resetAllMocks()

相关问题