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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 04:48:35