在 Promise 返回函数中测试回调



我有一个如下所示的方法:

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 asyncfakeAsync 助手的工作方式,预计可以测试问题中列出的回调;异步进程由 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())...
});

最新更新