Смоделируйте интерфейс машинописи с шуткой - PullRequest
0 голосов
/ 31 августа 2018

Можно ли подшучивать над интерфейсом машинописи с помощью jest?

Например:

import { IMultiplier } from "./IMultiplier";

export class Math {
  multiplier: IMultiplier;

  public multiply (a: number, b: number) {
    return this.multiplier.multiply(a, b);
  }
}

Тогда в тесте:

import { Math } from "../src/Math";
import { IMultiplier } from "../src/IMultiplier";

describe("Math", () => {

    it("can multiply", () => {
        let mathlib = new Math();
        mathlib.multiplier = // <--- assign this property a mock
        let result = mathlib.multiply(10, 2);
        expect(result).toEqual(20);
    });
});

Я пытался создать фиктивный объект, чтобы удовлетворить это несколькими способами, но ни один из них не работает. Например, назначив это макет:

let multiplierMock = jest.fn(() => ({ multiply: jest.fn() }));

Будет производить что-то вроде:

Error - Type 'Mock<{ multiply: Mock<{}>; }>' is not assignable to type 'IMultiplier'.

1 Ответ

0 голосов
/ 04 сентября 2018

Макет должен просто иметь такую ​​же форму , что и интерфейс.

(из документов : Одним из основных принципов TypeScript является то, что проверка типов фокусируется на форме, имеющей значения. Это иногда называют «типизацией утки» или «структурным подтипом». )

Так что mathlib.multiplier просто нужно присвоить объекту, который соответствует IMultiplier.

Я предполагаю, что IMultiplier из примера выглядит примерно так:

interface IMultiplier {
  multiply(a: number, b: number): number
}

Таким образом, тестовый пример будет работать нормально, изменив соответствующую строку следующим образом:

mathlib.multiplier = {
  multiply: jest.fn((a, b) => a * b)
};
...