Как заставить Jest настраиваемый сопоставитель работать в машинописи? - PullRequest
1 голос
/ 14 февраля 2020

У меня регулярно проходят модульные тесты, в которых мне нужно сравнить два моментальных объекта. Я бы нам использовал встроенную функцию момента moment.isSame (момент), чтобы сравнить их. Однако это означает, что мое утверждение будет выглядеть так:

expect(moment1.isSame(moment2)).toBeTrue();

Мне это не совсем понравилось, тем более что сообщение об ошибке будет менее информативным. Следовательно, я хотел написать собственный jest matcher "toBeSameMoment". Кажется, что следующий код компилируется как минимум:

import moment from "moment";

declare global {
  namespace jest {
    interface MomentMatchers extends Matchers<moment.Moment> {
      toBeSameMoment: (expected: moment.Moment) => CustomMatcherResult;
    }
  }
}

expect.extend({
  toBeSameMoment(received: moment.Moment, expected: moment.Moment): jest.CustomMatcherResult {
    const pass: boolean = received.isSame(expected);
    const message: () => string = () => pass ? "" : `Received moment (${received.toISOString()}) is not the same as expected (${expected.toISOString()})`;

    return {
      message,
      pass,
    };
  },
});

Однако я не могу заставить его работать в моем модульном тесте ... Когда я пытаюсь выполнить следующий тестовый код:

import moment from "moment";
import "../jest-matchers/moment";

describe("Moment matcher", () => {

  test("should fail", () => {
    const moment1 = moment.utc();
    const moment2 = moment();

    expect(moment1).toBeSameMoment(moment2);
  });

});

... тогда я получаю следующую ошибку:

error TS2339: Property 'toBeSameMoment' does not exist on type 'JestMatchersShape<Matchers<void, Moment>, Matchers<Promise<void>, Moment>>'.

Хотя я не совсем понимаю эту ошибку. Например, к какому типу void это относится? Я пытался погуглить об этом, но не нашел хорошего гида или около того. Я обратил внимание на этот вопрос: Как сообщить компилятору машинописи о нестандартных совпадениях? , который, по-видимому, в основном является дубликатом, но, по-видимому, еще недостаточно ясен.

У меня есть типы шуток, включенные в мой tsconfig

1 Ответ

2 голосов
/ 14 февраля 2020

Другой вопрос и ответ, на который вы ссылались, были правильными, и вы также можете найти очень краткий пример того, как расширить шутку в этом комментарии github о реагирующей на тестирование библиотеке.

Чтобы реализовать свое решение для вашего кода, просто измените:

declare global {
  namespace jest {
    interface MomentMatchers extends Matchers<moment.Moment> {
      toBeSameMoment: (expected: moment.Moment) => CustomMatcherResult;
    }
  }
}

На:

declare global {
  namespace jest {
    interface Matchers<R> {
      toBeSameMoment(expected: moment.Moment): CustomMatcherResult
    }
  }
}
...