在Promise返回函数

时间:2018-04-30 00:09:59

标签: angular asynchronous jasmine

我的方法如下所示:

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?
});

1 个答案:

答案 0 :(得分:0)

由于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())...
});