如何使用Jest模拟express.Application?

时间:2019-01-30 13:40:01

标签: node.js typescript express mocking jestjs

一些将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?整个过程,而不仅仅是请求或路由等。

1 个答案:

答案 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);