Website-Suche

jestjs - Jest spyOn funktioniert nicht mit TypeScript: „Eigenschaft 'mockRestore' fehlt im Typ 'Spy'“


Wenn ich spyOn mit jest und TypeScript verwende, erhalte ich diesen Typfehler:

Typ 'Spy' kann dem Typ 'SpyInstance<{}>' nicht zugewiesen werden. Die Eigenschaft 'mockRestore' fehlt im Typ 'Spy'.

Hier ist ein Codebeispiel, das es verursacht:

class A {
  foo = () => this.bar() + 1;
  bar = () => 1;
}

test('should pass', () => {
  const a = new A();
  let barSpy: jest.SpyInstance;
  barSpy = spyOn(a, 'bar');
  a.foo();
  expect(barSpy).toHaveBeenCalled();
});

Wenn ich dieses Beispiel ausführe, besteht der Test, aber der TypeScript-Compiler schlägt fehl.

Antwort #1

Kurze Antwort

Die globale spyOn(...)-Funktion gibt ein jasmine.Spy und kein jest.SpyInstance zurück. Der Grund dafür, soweit ich das beurteilen kann, ist, die Migration von Jasmine zu Jest zu erleichtern.

Hier sind zwei Optionen:

let barSpy: jest.SpyInstance;
barSpy = jest.spyOn(a, 'bar'); // <--- explicitly use jest.spyOn

// or

let barSpy: jasmine.Spy; // <--- use jasmine.Spy as your type
barSpy = spyOn(a, 'bar');

Weitere Erklärung

Die node_modules\@types\jest\index.d.ts-Datei enthält die Jest-Typdefinitionen. Wenn man sie betrachtet, kann man die zwei Implementierungen von spyOn sehen.

  • Das spyOn, das eine jest.SpyInstance zurückgibt, befindet sich im jest-Namespace.
  • Das spyOn, das ein jasmine.Spy zurückgibt, befindet sich im globalen Namensraum.

Es sei denn, Sie befinden sich im Prozess der Migration von Jasmine zu Jest, würde ich die Funktion jest.spyOn anstelle der globalen verwenden.

Verwandte Artikel