Как я могу издеваться над Express.Application с Jest? - PullRequest
0 голосов
/ 30 января 2019

Какой-то класс, который принимает в качестве аргумента выражение (базовый 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);

Как мне высмеивать express.Application с Jest?Все дело, а не просто запрос или маршрут и т. Д.

1 Ответ

0 голосов
/ 30 января 2019

Технически, express.Application не может быть подделано, это интерфейс.Это объект, который он представляет, который должен быть смоделирован.

Как указано в jest.mock документации , он

Возвращает объект jest для создания цепочки.

Так что это неправильный способ получения смоделированного объекта:

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);
...