在升级 Angular 后,在 Jasmine 中测试 window.scrollBy() 方法时,遇到 Lint 错误(期望有 2 个参数,但只有 1 个)。

4
在升级Angular 11时,其他一些包(例如jasmine-core)也已经升级。因此,在运行“npm run test”命令时会导致各种Lint问题,因为它们使“types”更加严格。
其中一个问题是window.scrollBy()方法。根据类型定义文件(lib.dom.ts),它可以有2个重载实现,如下所示-
scrollBy(options?: ScrollToOptions): void;
scrollBy(x: number, y: number): void;

但是在编写单元测试用例时,会出现以下 Lint 错误 -

it('should scroll down by 10 units', fakeAsync(() => {
    service.scrollDown(10);
    expect(window.scrollBy).toHaveBeenCalledWith({
      top: 10,
      left: 0,
      behavior: 'smooth',
    });
  }));

enter image description here

看起来它只考虑了第二个重载实现,而没有考虑我们也可以只传递参数即“选项”的第一个重载。尽管测试用例被正确通过了。

我在下面的Github链接中创建了一个最小化的复制示例。如果需要任何额外的信息,请告诉我。非常感谢任何帮助或指针。

https://github.com/HimanshuGoel/scrollByIssue


这个有没有什么进展? - Miguel Leite
还没有。我现在只是使用 toHaveBeenCalled() 作为解决方法,而不是使用 toHaveBeenCalledWith()。:( - Himanshu
scrollTo 函数的问题也是一样。唯一解决该问题的方法是添加 // @ts-ignore,但这不是一个好的解决方案。顺便说一下,这不是一个代码风格问题,而是 TypeScript 编译错误。 - JSON Derulo
1个回答

0
正如你所指出的,scrollBy() 函数是重载的,除此之外还有其他滚动函数,如 scrollTo()toHaveBeenCalledWith() 函数在处理重载函数时存在已知问题:https://github.com/DefinitelyTyped/DefinitelyTyped/issues/42455 为了让编译器满意,你可以直接检查第一次调用的参数,使用 any
it('should scroll down by 10 units', fakeAsync(() => {
    const spy = spyOn(window, 'scrollBy');
    service.scrollDown(10);
    expect(spy.calls.argsFor(0)).toEqual([{
      top: 10,
      left: 0,
      behavior: 'smooth',
    } as any]);
  }));

然而,有些情况下可能无法奏效,例如当多次调用间谍函数时,您事先不知道哪个是正确的。我曾经遇到过这样的情况,在使用 TypeScript 的 5 年中,这是我第一次在代码中加入 // @ts-ignore


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接