Jest spyOn 不使用打字稿:“类型 'Spy' 中缺少属性 'mockRestore'”

jjb*_*kir 4 typescript jestjs

当将spyOn与 jest 和typescript一起使用,我收到此类型错误:

类型“Spy”不可分配给类型“SpyInstance<{}>”。'Spy' 类型中缺少属性 'mockRestore'。

这是导致它的代码示例:

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();
});
Run Code Online (Sandbox Code Playgroud)

当我运行此示例时,测试通过,但打字稿编译器失败。

Sha*_*tin 8

简答

全局spyOn(...)函数返回 a jasmine.Spynot a jest.SpyInstance。据我所知,这样做的原因是为了简化从 Jasmine 到 Jest 的迁移。

这里有两个选项:

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');
Run Code Online (Sandbox Code Playgroud)

进一步说明

node_modules\@types\jest\index.d.ts文件具有 Jest 类型定义。通过查看它们,我们可以看到spyOn.

  • spyOn返回一个jest.SpyInstance是内部的jest命名空间。
  • spyOn返回一个jasmine.Spy是全局命名空间。

除非您正在从 Jasmine 迁移到 Jest,否则我会使用该jest.spyOn函数而不是全局函数。