如何在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版本,可通过全局测试钩子自定义实现校验逻辑:
- 找到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() })
- 若你使用
jest.fn()手动创建Mock,只需要在创建后手动将Mock实例push到registeredStubs数组,即可纳入校验范围。
内容的提问来源于stack exchange,提问作者Onome Sotu
相关产品推荐
相关产品推荐

