typescript - Står inför Lint-fel (Förväntade 2 argument, men fick 1) vid testning av window.scrollBy()-metoden i Jasmine efter Angular-uppgradering


När uppgraderingen till Angular 11 utfördes uppgraderades även ett par andra paket som jasmine-core. På grund av detta orsakar körningen av kommandot 'npm run test' olika lint-problem eftersom de har gjort 'types' mer strikt.

Ett av problemen är med window.scrollBy()-metoden. Enligt typdefinitionsfilen (lib.dom.ts) kan den ha 2 överlagrade implementationer som nedan -

scrollBy(options?: ScrollToOptions): void;
scrollBy(x: number, y: number): void;

Men när jag skriver enhetstestfallet får jag Lint-fel enligt nedan -

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

Det ser ut som om den endast överväger den andra överlagrade implementationen, inte den första där vi också kan skicka endast en parameter, dvs "options". Även om testfallet passerar korrekt.

Jag har skapat ett minimalt reproduktions exempel på länken nedan på Github. Vänligen låt mig veta om ytterligare information behövs. All hjälp eller tips skulle uppskattas verkligen.

https://github.com/HimanshuGoel/scrollByIssue

Svar #1

Som du påpekade är scrollBy()-funktionen överlagrad, bland andra rullningsfunktioner som scrollTo(). Funktionen toHaveBeenCalledWith() har ett känt problem med typningen av överlagrade funktioner: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/42455

För att göra kompilatorn nöjd kan du kontrollera argumenten för det första anropet direkt, med 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]);
  }));

Det kan dock finnas fall där detta inte fungerar, t.ex. när det finns flera anrop till spionfunktionen och du inte vet i förväg vilket som är det rätta. Jag hade ett fall som detta, och det är första gången på 5 år av att använda TypeScript som jag har satt en // @ts-ignore i min kod.

Relaterade artiklar