Lorsque vous utilisez jest.fn()
pour ajouter une maquette, vous pouvez généralement accéder à la propriété .mock
Pour accéder à des détails tels que les appels, quelque chose de similaire à ceci:
test('not working', () => {
const foo = new Foo();
foo.addListener = jest.fn();
foo.func(); // will call addListener with a callback
const callback = foo.addListener.mock.calls[0][0];
expect(callback()).toEqual(1); // test the callback
});
Lors de l'implémentation du test en TypeScript au lieu de javascript simple, j'obtiens l'erreur:
erreur TS2339: la propriété 'mock' n'existe pas sur le type '(rappel: () => nombre) => void'.
Je peux me débarrasser de l'erreur en effectuant un cast vers any
mais il doit sûrement y avoir un meilleur moyen:
const callback = (foo.addListener as any).mock.calls[0][0];
Dans ce code simple, la maquette peut être réécrite pour stocker l'argument à l'aide de jest.fn(fn => { callback = fn; });
mais la même erreur se produit lors de l'utilisation de foo.addListener.mockClear()
qui ne peut pas être retravaillée de la même manière.
Alors, comment puis-je me débarrasser de l'erreur, de préférence sans perdre la sécurité de type?
Vous pouvez utiliser jest.spyOn
en combinaison avec des fonctions comme mockImplementation
pour se moquer d'une fonction tout en préservant la sécurité des types dans TypeScript:
class Foo {
addListener = (callback: () => number) => { }
func = () => {
this.addListener(() => 1);
}
}
test('working', () => {
const foo = new Foo();
const mockAddListener = jest.spyOn(foo, 'addListener'); // spy on foo.addListener
mockAddListener.mockImplementation(() => { }); // replace the implementation if desired
foo.func(); // will call addListener with a callback
const callback = mockAddListener.mock.calls[0][0];
expect(callback()).toEqual(1); // SUCCESS
});