如何让Jest模拟函数默认抛出错误?
为jest-mock-extended模拟对象设置全局默认抛出实现的方案
当使用jest-mock-extended创建接口Mock时,未显式指定实现的函数默认返回undefined,这常会导致模糊的测试失败或TypeScript类型不匹配问题。要避免这种情况,无需逐个手动为函数设置抛出实现,有两种更高效的方式:
方法一:直接使用jest-mock-extended的内置配置
mock函数支持传入第二个配置参数,通过defaultMockImplementation可以为所有未显式模拟的函数设置默认行为:
import { mock } from 'jest-mock-extended'; export interface SomeClient { someFunction(): number; someOtherFunction(): number; } // 创建带默认抛出的Mock对象 const mockClient = mock<SomeClient>({}, { defaultMockImplementation: function() { // 利用this获取当前mock函数的名称,抛出更精准的错误 throw new Error(`未模拟函数 ${this.getMockName()} 被调用`); } }); // 仅显式模拟需要的函数 mockClient.someFunction.mockImplementation(() => 1); mockClient.someFunction(); // 返回 1 mockClient.someOtherFunction(); // 抛出错误:未模拟函数 someOtherFunction 被调用
方法二:封装通用Mock工厂函数
如果需要在多个测试文件中复用这个默认行为,可以封装一个自定义的Mock工厂,避免重复写配置:
import { mock, MockProxy } from 'jest-mock-extended'; // 自定义工厂函数:返回带默认抛出的Mock对象 const createMockWithDefaultThrow = <T>(): MockProxy<T> => { return mock<T>({}, { defaultMockImplementation: function() { throw new Error(`未模拟函数 ${this.getMockName()} 被调用`); } }); }; // 使用工厂创建Mock const mockClient = createMockWithDefaultThrow<SomeClient>(); mockClient.someFunction.mockImplementation(() => 1); // 调用效果和方法一一致 mockClient.someFunction(); // 返回 1 mockClient.someOtherFunction(); // 抛出精准错误
这两种方式都能让未模拟的函数调用立刻抛出明确错误,直接定位问题根源,避免因undefined引发的后续模糊报错。
内容的提问来源于stack exchange,提问作者Justin Caldicott
相关产品推荐
相关产品推荐

