如何使用 returns Promise 的模拟服务正确测试?

How do I properly test using a mocked service that returns a Promise?

我是 Angular 的新手,我仍在努力弄清楚它是如何工作的。我目前在测试依赖于 returns 和 Promise 服务的组件时遇到问题。我正在测试的函数结构如下:

success: boolean;    

borrowBook() {
  this.bookService.borrow(this.selectedBook.id)
    .then(() => {
      this.success = true;
    })
    .catch((error: BorrowingError) => {
      this.success = false;
    });
}

现在,我不太确定像上面的代码这样的东西是否被认为是惯用的,但这就是我编写代码的方式。在我的单元测试中,我使用 jasmine.createSpyObj 函数模拟了 bookService,并将存根定义如下:

mockBookService.borrow.and.returnValue(Promise.resolve(testResult));

但是,我的测试失败了,说 component.success 是未定义的,而我希望它是真实的。我的测试程序如下:

it('test', async(() => {
  mockBookService.borrow.and.returnValue(Promise.resolve(testResult));
  //setup pre-conditions here...
  component.borrowBook(();

  expect(component.success).toBeTruthy();
}));

我的印象是,甚至在相应地处理 Promise 之前就已经检查了期望。

我偶然发现了这个 article about testing asynchronous code in Angular,其中指出 flushMicrotasks 函数可用于 运行 所有异步组件,然后再检查预期。这仅通过 fakeAsync 创建的假区域提供,因此在我的代码中我使用了它,而不仅仅是 async.

it('test', fakeAsync(() => { //used fakeAsync instead
  mockBookService.borrow.and.returnValue(Promise.resolve(testResult));
  //setup pre-conditions here...
  component.borrowBook(();

  flushMicrotasks(); //added this before checking expectations
  expect(component.success).toBeTruthy();
}));