Búsqueda de sitios web

typescript - ¿Cómo agregar una sugerencia de tipo para una aserción personalizada de chai?


Dentro de un proyecto de TypeScript, creé una afirmación personalizada para la biblioteca de afirmaciones Chai de la siguiente manera:

// ./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`,
        );
    },
);

Lo uso de esta manera:

require("../assertions/assertTimestamp");
import {expect} from "chai";


describe("My test", () => {
   it("should test timestamp", () => {
     expect(1610841600000).to.be.timestampOf("2021-01-16");
   });
});

Sin embargo, obtengo un error de TypeScript:

TS2339:Property 'timestampOf' does not exist on type 'Assertion'.

Sé que puedo solucionar este problema mediante:

(expect(1610841600000).to.be as any).timestampOf("2021-01-16");

pero prefiero registrar mi método dentro de TypeScript, para que también pueda hacer uso de la autocompletación dentro de mi IDE.

Respuesta #1

Dentro de tu assertTimestamp.ts puedes agregar:

declare global {
    export namespace Chai {
        interface Assertion {
            timestampOf(date: string, format?: string): void;
        }
    }
}

agregará su función personalizada mientras mantiene la existente en su lugar.

Si ejecutas tu prueba ahora, fallará, como se esperaba, con:

AssertionError: 
EXPECTED: "2021-01-16T00:00:00.000Z"
GOT:      "2021-01-17T00:00:00.000Z"
: expected 1610841600000 to equal 1610755200000
Expected :1610755200000
Actual   :1610841600000