typescript - Wie fügt man einen Typ-Hinweis für eine benutzerdefinierte Chai-Assertion hinzu?
Innerhalb eines TypeScript-Projekts habe ich eine benutzerdefinierte Assertion für die Chai-Assertion-Bibliothek wie folgt erstellt:
// ./tests/assertions/assertTimestamp.ts
import moment = require("moment");
import {Moment} from "moment";
const {Assertion} = require("chai");
const parseDateWithTime = (dateWithTime: string, format = "YYYY-MM-DD hh:mm:ss"): Moment => {
return moment.utc(dateWithTime, format);
};
const formatTimestamp = (timestampInMs: number): string => {
return moment.utc(timestampInMs).toISOString();
};
Assertion.addMethod("timestampOf", function (humanReadableDate: string, format = "YYYY-MM-DD hh:mm:ss") {
const expectedValue = parseDateWithTime(humanReadableDate, format);
const formatted = formatTimestamp(this._obj);
new Assertion(this._obj)
.to.eq(
expectedValue.valueOf(),
`\nEXPECTED: "${expectedValue.toISOString()}"\nGOT: "${formatted}"\n`,
);
},
);
Ich benutze es auf diese Weise:
require("../assertions/assertTimestamp");
import {expect} from "chai";
describe("My test", () => {
it("should test timestamp", () => {
expect(1610841600000).to.be.timestampOf("2021-01-16");
});
});
Aber ich bekomme Typescript-Fehler:
TS2339:Property 'timestampOf' does not exist on type 'Assertion'.
Ich weiß, dass ich dieses Problem umgehen kann über:
(expect(1610841600000).to.be as any).timestampOf("2021-01-16");
aber ich möchte meine Methode lieber in TypeScript registrieren, damit ich auch die Autovervollständigung in meiner IDE nutzen kann.
Antwort #1
Innerhalb Ihrer assertTimestamp.ts können Sie hinzufügen:
declare global {
export namespace Chai {
interface Assertion {
timestampOf(date: string, format?: string): void;
}
}
}
Es wird Ihre benutzerdefinierte Funktion hinzufügen und dabei die vorhandene beibehalten.
Wenn Sie Ihren Test jetzt ausführen, wird er wie erwartet fehlschlagen mit:
AssertionError:
EXPECTED: "2021-01-16T00:00:00.000Z"
GOT: "2021-01-17T00:00:00.000Z"
: expected 1610841600000 to equal 1610755200000
Expected :1610755200000
Actual :1610841600000
