当前位置: 首页 > 知识库问答 >
问题:

如何重置Jest mock函数每次测试前调用计数

袁子瑜
2023-03-14

我是新来的笑话,我试图用它来测试一个函数是否被调用。我注意到mock.calls.length不是每次测试都重置,而是累积。我怎样才能在每次考试前把它变成0?我不想我的下一次测试取决于前一次的结果。

我知道在开玩笑的时候,每个人之前都有——我应该用它吗?重置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);
});

共有3个答案

郎献
2023-03-14

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

module.exports = {
  resetMocks: true,
};

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

重置模拟[布尔]

默认值:false

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

韩自怡
2023-03-14

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

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

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

宋鸿德
2023-03-14

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

要添加到Sum.test.js,请执行以下操作:

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

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

afterEach(() => {
  jest.clearAllMocks();
});
 类似资料:
  • 问题内容: 我的Spring-Boot-Mvc-Web应用程序在文件中具有以下数据库配置: 这是我所做的唯一配置。我在任何地方都没有进行任何其他配置。尽管如此,Spring和子系统会在每次Web应用程序运行时自动重新创建数据库。即在系统运行时重新创建数据库,而在应用程序结束后它包含数据。 我不了解此默认值,并期望它适合测试。 但是,当我开始运行测试时,我发现数据库仅重建一次。由于没有按预定义的顺序

  • 我们正在编写一个Spring Boot应用程序并使用云合约WireMock支持来存根支持服务。我们的测试类注释如下: 这工作正常,除了一件事:我们发现Spring Cloud似乎没有在测试之间重置WireMock,特别是删除存根,因此测试没有正确隔离。当然,您可以使用包含的方法自己完成此操作,但我们想知道这是否是故意的。是否有我们忽略的选项或必须使用的附加注释? 毕竟,在一个方法中定义存根是不可能

  • 问题内容: 使用它可以在指定的时间启动功能: 但是,如果我想多次启动该功能怎么办?每次经过一个时间间隔,我都想执行该功能(假设每60秒执行一次)。 问题答案: 如果您不在乎内的代码是否可能花费比您的间隔更长的时间,请使用: 一遍又一遍地触发作为第一个参数传入的函数。 更好的方法是与函数一起使用: 这样可以保证在执行代码之前不会进行下一个调用。在本示例中,我将其用作函数参考。这是给函数命名并在其中调

  • 我正在使用一个调用函数的API开发一个web服务器。这个函数的任务很繁重,并且会缓存结果。我的设计方式是,如果没有缓存,并且多个用户同时使用相同的参数调用此API,服务器只为第一个请求调用该函数一次,所有其他请求等待完成作业并从缓存返回响应。 我用这种方式写了一个测试: 我可以通过在这个沉重的函数中打印一个值来检查我的代码是否正常工作,并检查控制台,看看它是否只出现一次,但是如果这个函数被调用了更

  • 我正在测试路由器,有两个函数,我需要测试第一个函数是否被调用,第二个函数是否被调用。有方法

  • 我已经将会话管理为,现在在支持bean的构造函数中,我正在做一些验证,但是由于当用户第一次尝试点击页面时,bean的作用域是,我正在调用托管bean的构造函数并进行一些验证,以查看用户是否有权访问上传页面。 所以在第一次尝试时,我调用构造函数,收到验证错误消息说,页面对用户不可用,但现在如果我转到任何其他选项卡并单击返回到页面菜单选项卡,该页面将显示,我如何更改此行为,以便在每次页面加载时检查验证