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

时间:2020-04-26 19:46:33

标签: javascript angular unit-testing rxjs jasmine

我是Angular的新手,我仍在尝试弄清楚它的工作方式。我目前无法测试依赖于返回Promise的服务的组件。我正在测试的功能的结构如下:

success: boolean;    

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

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

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之前,也要检查期望值。

1 个答案:

答案 0 :(得分:0)

我偶然发现了这个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();
}));