Jest使用模块工厂参数mock类多方法时mock不生效如何解决?
问题根源
- 实例不匹配:你在测试文件顶部提前实例化的
dataService,和handler函数每次执行时内部新生成的DataService实例不是同一个对象,修改外部实例的mock规则不会影响handler内部的执行逻辑。 - 清理时机错误:
afterAll仅会在所有测试用例全部执行完成后才重置mock,前一个测试的mock结果会残留到后续用例,导致分支判断逻辑被提前拦截。 - 方法名拼写错误:测试CreateItem错误的用例中调用了不存在的
SaveApplicant方法,mock规则完全不生效。
修复方案
- 删除测试文件顶部提前实例化的
dataService,每个测试用例单独定义当前需要的mock实现,保证各个用例的mock规则完全隔离。 - 将
afterAll改为afterEach,每个测试用例执行完成后立刻重置所有mock,避免残留影响。 - 针对每个分支测试场景,单独指定对应方法的返回值,其余方法默认返回正常结果,保证可以走到目标判断分支。
修改后的测试代码
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
相关产品推荐
相关产品推荐

