如何使用 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();
}));
我是 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();
}));