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 einejest.SpyInstancezurückgibt, befindet sich imjest-Namespace. - Das
spyOn, das einjasmine.Spyzurü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.
