Тестирование обратного вызова внутри функции возврата Promise - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть метод, который выглядит следующим образом:

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

В настоящее время я пытаюсь протестировать эту функцию в своем тесте Жасмин и не уверен, как я могу дождаться окончания внутреннего Обсервата, прежде чем ожидать чего-либо.

Обычно я могу протестировать одно обещание, выполнив что-то вроде:

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 голосов
/ 30 апреля 2018

Из-за того, как работают помощники 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())...
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...