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

Jest使用模块工厂参数mock类多方法时mock不生效如何解决?

问题根源

  • 实例不匹配:你在测试文件顶部提前实例化的dataService,和handler函数每次执行时内部新生成的DataService实例不是同一个对象,修改外部实例的mock规则不会影响handler内部的执行逻辑。
  • 清理时机错误:afterAll仅会在所有测试用例全部执行完成后才重置mock,前一个测试的mock结果会残留到后续用例,导致分支判断逻辑被提前拦截。
  • 方法名拼写错误:测试CreateItem错误的用例中调用了不存在的SaveApplicant方法,mock规则完全不生效。

修复方案

  1. 删除测试文件顶部提前实例化的dataService,每个测试用例单独定义当前需要的mock实现,保证各个用例的mock规则完全隔离。
  2. 将afterAll改为afterEach,每个测试用例执行完成后立刻重置所有mock,避免残留影响。
  3. 针对每个分支测试场景,单独指定对应方法的返回值,其余方法默认返回正常结果,保证可以走到目标判断分支。

修改后的测试代码

const { handler } = require("./handler");
const DataService = require("../services/data.service");

jest.mock("../services/data.service");

describe("Job Apply Handler", () => {
  afterEach(() => {
    jest.resetAllMocks();
  });

  it("Successful response", async () => {
    DataService.mockImplementation(() => ({
      CreateItem: jest.fn().mockResolvedValue({ data: true, error: null }),
      SendToAnalytics: jest.fn().mockResolvedValue({ data: true, error: null }),
      SendEmail: jest.fn().mockResolvedValue({ data: true, error: null }),
    }));
    const res = await handler();
    expect(res.statusCode).toEqual(200);
  });

  it("Error Response because of CreateItem Error", async () => {
    DataService.mockImplementation(() => ({
      CreateItem: jest.fn().mockResolvedValue({ data: null, error: true }),
      SendToAnalytics: jest.fn().mockResolvedValue({ data: true, error: null }),
      SendEmail: jest.fn().mockResolvedValue({ data: true, error: null }),
    }));
    const res = await handler();
    expect(res.statusCode).toEqual(500);
  });

  it("Error Response because of SendToAnalytics Error", async () => {
    DataService.mockImplementation(() => ({
      CreateItem: jest.fn().mockResolvedValue({ data: true, error: null }),
      SendToAnalytics: jest.fn().mockResolvedValue({ data: null, error: true }),
      SendEmail: jest.fn().mockResolvedValue({ data: true, error: null }),
    }));
    const res = await handler();
    expect(res.statusCode).toEqual(500);
  });

  it("Error Response because of SendEmail Error", async () => {
    DataService.mockImplementation(() => ({
      CreateItem: jest.fn().mockResolvedValue({ data: true, error: null }),
      SendToAnalytics: jest.fn().mockResolvedValue({ data: true, error: null }),
      SendEmail: jest.fn().mockResolvedValue({ data: null, error: true }),
    }));
    const res = await handler();
    expect(res.statusCode).toEqual(500);
  });

  it("Error Response because of Exception", async () => {
    DataService.mockImplementation(() => ({
      CreateItem: jest.fn().mockRejectedValue(new Error("error")),
      SendToAnalytics: jest.fn().mockResolvedValue({ data: true, error: null }),
      SendEmail: jest.fn().mockResolvedValue({ data: true, error: null }),
    }));
    const res = await handler();
    expect(res.statusCode).toEqual(500);
  });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 07:27:02