如何使用Jest模拟express.Application以适配依赖注入类?
解决Jest模拟express.Application时的类型不兼容问题
我之前也碰到过这个类型匹配的坑,本质是jest.mock("express")生成的默认模拟对象并没有和express.Application的类型对齐,TypeScript自然会报参数不可分配的错误。下面给你两种可行的解决方式:
方法一:手动定义模拟对象并断言类型
这种方式最灵活,你可以只模拟App类实际用到的express方法:
import express from 'express'; import { App } from './path-to-your-app-class'; // 先mock整个express模块 jest.mock('express'); // 定义符合express.Application结构的模拟对象,只实现你需要的方法 const expressMock = { use: jest.fn(), listen: jest.fn(), get: jest.fn(), // 按需添加App中用到的其他express方法,比如post、delete等 } as unknown as express.Application; // 让mock的express函数返回我们定义的模拟对象 (express as jest.Mock).mockReturnValue(expressMock); // 现在就能正常实例化App了 let app = new App(expressMock);
方法二:利用Partial接口简化模拟
如果不想手动写所有方法,可以用Partial<express.Application>来生成一个部分实现的对象,再断言成完整类型:
import express, { Application } from 'express'; import { App } from './path-to-your-app-class'; jest.mock('express'); // 创建一个Partial版的Application,只模拟需要的方法 const partialAppMock: Partial<Application> = { use: jest.fn(), listen: jest.fn(), }; // 断言为完整的Application类型 const expressMock = partialAppMock as Application; // 绑定到express的mock函数 (express as jest.Mock).mockReturnValue(expressMock); // 实例化App const appInstance = new App(expressMock);
补充:自动生成模拟对象
如果你想快速生成包含所有express.Application方法的mock,可以用jest.createMockFromModule,不过可能需要微调类型:
import express from 'express'; import { App } from './path-to-your-app-class'; // 自动生成模拟并断言类型 const expressMock = jest.createMockFromModule('express')() as express.Application; // 直接传入App构造函数 let app = new App(expressMock);
这种方式适合需要用到较多express方法的场景,不过自动生成的mock方法都是空的jest函数,你可以根据测试需求去mock它们的实现。
内容的提问来源于stack exchange,提问作者lonix
相关产品推荐
相关产品推荐

