一些将express作为参数的类(基本DI):
class App {
constructor(express: express.Application) { /* ... */ }
}
我的测试:
// this doesn't work ("argument not assignable"):
//const expressMock = jest.mock("express");
//let app = new App(expressMock);
// so how do I mock it?
const expressMock = ???
let app = new App(expressMock);
如何使用Jest模拟express.Application
?整个过程,而不仅仅是请求或路由等。
答案 0 :(得分:1)
从技术上讲,express.Application
无法被模拟,它是一个接口。它代表的对象应该被嘲笑。
jest.mock
documentation 指出
返回用于链接的笑话对象。
因此,这不是检索模拟对象的正确方法:
const expressMock = jest.mock("express");
正确的是
jest.mock("express");
...
const expressMock = require("express");
此外,App
不接受express
工厂函数,而是接受应用程序对象,这是express()
调用的结果。
jest.mock
如果没有工厂功能,则会导致自动模拟express
工厂,而不会产生适当的应用程序对象。
由于expressMock
是在测试中直接传递给App
的,因此无需模拟Express模块。可以传递包含最低限度实现的模拟程序:
const expressMock = {
use: jest.fn(),
...
} as any as express.Application;
let app = new App(expressMock);