У меня регулярно проходят модульные тесты, в которых мне нужно сравнить два моментальных объекта. Я бы нам использовал встроенную функцию момента 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