You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Jest中配置存在未使用mock/stub时自动触发测试失败

Jest 实现未使用Stub/Mock校验方案

Jest没有内置和Mockito UnnecessaryStubbingException完全对等的开箱校验能力,可通过以下两种方式实现同等效果:

方案1:开启Jest严格Mock校验(适用于Jest 29+版本)

在jest.config.js中配置mockOptions.strict = true即可开启原生严格校验:

module.exports = {
  // 其余原有配置保持不变
  mockOptions: {
    strict: true
  }
}

开启后,若某个Mock被设置了返回值、调用逻辑等Stub规则,但测试执行全程未被调用,测试结束后会自动抛出对应错误,和Mockito的异常逻辑完全对齐。

方案2:手动封装全局校验逻辑(兼容低版本Jest)

如果使用的是低于29的Jest版本,可通过全局测试钩子自定义实现校验逻辑:

  1. 找到Jest配置中setupFilesAfterEnv指定的全局初始化文件(通常命名为setupTests.js),添加如下代码:
// 存储所有已创建的Stub
const registeredStubs = []
// 重写jest.spyOn自动收集Stub
const originalSpyOn = jest.spyOn
jest.spyOn = (...args) => {
  const stub = originalSpyOn(...args)
  registeredStubs.push(stub)
  return stub
}
// 单个测试用例执行完毕后做校验
afterEach(() => {
  const unusedStubs = registeredStubs.filter(stub => stub.mock.calls.length === 0)
  if (unusedStubs.length > 0) {
    const errorLines = [
      'Unnecessary stubbings detected.',
      'Clean & maintainable test code requires zero unnecessary code.',
      'Following stubbings are unnecessary:'
    ]
    unusedStubs.forEach((stub, index) => {
      errorLines.push(`  ${index + 1}. Mock name: ${stub.getMockName()}, call count: 0`)
    })
    // 清空存储避免影响下一个用例
    registeredStubs.length = 0
    throw new Error(errorLines.join('\n'))
  }
  // 校验通过后清空存储和Mocks
  registeredStubs.length = 0
  jest.clearAllMocks()
})
  1. 若你使用jest.fn()手动创建Mock,只需要在创建后手动将Mock实例push到registeredStubs数组,即可纳入校验范围。

内容的提问来源于stack exchange,提问作者Onome Sotu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 15:27:03