我有一个如下所示的方法:
public async updateData(callback): Promise<any> {
this.observableOne = this.httpClient.get(...);
this.observableOne.subscribe(data => {
// do things...
callback();
});
}
从我的组件中,我像这样调用以下函数:
this.myService.updateData(function() {
// do more things...
});
我目前正在尝试在我的 Jasmine 测试中测试此功能,并且不确定如何在期待任何事情之前等待内部可观察性完成。
我通常可以通过执行以下操作来测试单个承诺:
myService.myPromise.then(data => { expect(data.items).toBeDefined(); });
但是因为内部 Observable 确实是我在尝试解决任何问题之前想要等待的,所以我如何测试这个回调逻辑?
我正在尝试这样做:
myService.updateData(function() {
// make assertions in here
// at this point though, is my Promise done and the callback resolved?
});
由于 Angular async
和 fakeAsync
助手的工作方式,预计可以测试问题中列出的回调;异步进程由 Zone 跟踪.js并且 Jasmine done
回调是不必要的。在单元测试中,HttpClient
请求都应该被模拟,因此没有异步进程,并且可以使用fakeAsync
同步执行测试:
it('...', fakeAsync(inject(..., (...) => {
myService.updateData(function() {
expect(...)...
});
});
updateData
是一种反模式,因为它是承诺、可观察量和常规回调的混合体。尽管它是async
的并返回一个承诺,但它实际上并没有被使用。最好将其重构为承诺:
public async updateData(callback): Promise<any> {
const data = await this.httpClient.get(...).toPromise();
...
return data;
}
使用async
函数测试承诺更清晰:
it('...', fakeAsync(inject(..., async (...) => {
expect(await myService.updateData())...
});