我的方法如下所示:
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测试中测试这个函数,并且我不确定在期待任何事情之前我是如何等待内部Observable完成的。
我通常可以通过执行以下操作来测试单个Promise:
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?
});
答案 0 :(得分:0)
由于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())...
});