web-dev-qa-db-fra.com

la simulation de la propriété jest TypeScript n'existe pas sur le type

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?

9
ext

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
});
13
Brian Adams