首页 > 解决方案 > Angular 9:间谍等待功能(单元测试)

问题描述

角 9

我有一个函数,它async用 await 调用另一个函数,如下所示。

  async hoge() {
    for (let i = 0; i < 10; i++) {
      this.piyo(i);
    }

    for (let i = 0; i < 10; i++) {
      await this.fuga(i);
    }
  }

  fuga(idx: number) {
    return new Promise((resolve, reject) => {
      if (idx < 5) {
        resolve();
      } else {
        reject();
      }
    });
  }

  piyo(idx: number) {
    return;
  }

我尝试为该函数添加单元测试async hoge(),以检查piyo()fuga()在执行时被调用 10 次。

piyo(),正常功能的测试效果很好,但fuga()没有;显示错误

预计间谍 fuga 已被调用 10 次。它被调用了1次。


  it("fuga called 10 times from hoge func", () => {
    // spy function which will return Promise
    const spyObj = spyOn(component, "fuga").and.callFake(() => {
      return Promise.resolve();
    });

    component.hoge();

    expect(spyObj).toHaveBeenCalledTimes(10);
  });

  it("piyo called 10 times from hoge func", () => {
    const spyObj = spyOn(component, "piyo");

    component.hoge();

    expect(spyObj).toHaveBeenCalledTimes(10);
  });

考虑到这种情况,async使得这个测试失败了。但我不知道如何修改这个测试代码。如果有人能给我任何想法,我将不胜感激。

这是 stackblitz 上的全部代码
https://stackblitz.com/edit/angular-unit-tests-uxwzw1?file=src%2Fapp%2Fapp.component.spec.ts

谢谢

标签: angularunit-testing

解决方案


您的测试不起作用,因为代码是异步执行的(在这种情况下是因为承诺)。

Angular 有工具可以测试异步代码和. 您可以使用包装您的测试,然后使用它来指示异步执行。fakeAsynctickfakeAsynctick

it("fuga called 10 times from hoge func", fakeAsync(() => {
    // spy function which will return Promise
    const spyObj = spyOn(component, "fuga").and.callFake(() => {
      return Promise.resolve();
    });

    component.hoge();
    tick();

    expect(spyObj).toHaveBeenCalledTimes(10);
}));

推荐阅读