typer - Hur låter man TypeScript veta om anpassade Jest-matchers?


Jag har ett react/typescript-projekt som använder jest, där jag har en anpassad matchare som:

export const MyCustomMatchers = {
    toBeTheSameAsRemote: function(_util: any, _customEqualityTesters: any) {
        return {
            compare: function(actual: Brand, expected: RemoteBrand) {
                const pass: boolean = attributesMatch(actual, expected);
                const message: string = pass
                    ? 'Local matches Remote'
                    : 'Local does not match Remote';

                return { pass, message: () => message };
            }
        };
    }
};

vilket jag refererar till i mina tester genom att göra inne i describe-funktionen:

beforeEach(() => {
  jasmine.addMatchers(MyCustomMatchers);
});

Och använd på detta sätt i it-funktioner:

expect(localValue).toBeTheSameAsRemote(remoteValue);

Tester körs korrekt, men TypeScript-kompilatorn känner inte igen matchern, vilket är logiskt eftersom jag inte har definierat den någonstans i typ-systemet

Property 'toBeTheSameAsRemote' does not exist on type 'JestMatchersShape<Matchers<void, MyType[]>, Matchers<Promise<void>, MyType[]>>'.ts(2339)

Det jag har hittat hittills rör att utöka namespace för jasmine och/eller jest, t.ex.

declare namespace jasmine {
    interface Matchers {
        toBeTheSameAsRemote(remote: any): any;
    }
}

vilket inte har fungerat för mig.

Har du någon aning?

Svar #1

Prova detta:

Filen nedan deklarerar både den faktiska implementeringen expect.extend och även TypeScript-deklarationen.

custom-matcher.ts:

declare global {
  namespace jest {
    interface Matchers<R> {
        toBeTheSameAsRemote: (expected: string) => CustomMatcherResult;
    }
  }
}

expect.extend({
    /**
     * Notice that this implementation has 2 arguments, but the implementation inside the Matchers only has 1
     */
    toBeTheSameAsRemote(
    received: string,
    expected: string
  ) {
    return {
      pass: false,
      message: "A GraphQl error was expected"
    };
  }
});

// I am exporting nothing just so we can import this file
export default undefined;

Nu, på din testfil, importera ovanstående modul.

actual-test.ts:

// importing the custom matcher file is important
import "../../testing/custom-matchers/custom-matcher";

describe("something", () => {
   it("should work", () => {
       expect(localValue).toBeTheSameAsRemote(remoteValue);
   });
});

Anteckningar:

  • expect.extend kommer att kallas automatiskt från importen. Det finns inget behov av att kalla expect.extend i varje testfil.
  • declare global är nödvändigt eftersom jest inte importeras explicit (det är en global import).
  • Signaturen för toBeTheSameAsRemote-funktionen är inte densamma i expect.extend och i TypeScript.

Relaterade artiklar