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.extendkommer att kallas automatiskt från importen. Det finns inget behov av att kallaexpect.extendi varje testfil.declare globalär nödvändigt eftersomjestinte importeras explicit (det är en global import).- Signaturen för
toBeTheSameAsRemote-funktionen är inte densamma iexpect.extendoch i TypeScript.
