Проверьте возвращаемое значение из .then или .catch с жасмином - PullRequest
0 голосов
/ 25 февраля 2019

Мы пытаемся протестировать функцию, которая вызывает асинхронную функцию.Проблема в том, что эта функция возвращает обещание, и если мы проверяем значение, которое должно быть изменено в .then () или .catch (), то значение не обновляется, так как часть кода, которая его меняет, не имеетеще не произошло.

Я бы хотел, чтобы мои тесты ждали того или другого момента.

exampleFunction() {
    if (this.path !== this.openFolder) {
        this.myService.asyncFunction(this.openFolder)
          .then((data) => {
          // I do some stuff
           return true;
          })
          .catch((data) => {
            // I do some stuff
            return true;
          });
      } else {
        return false;
      }
}
it('should return true', () => {
    const aPath = 'SOMETHING';
    component.path = aPath;
    component.openFolder = aPath;
    component.openBrowse();
    expect(component.path).toBe(Path);
  });

(Конечно, я издевался над своим сервисом и мои функции выглядели так)

async asyncFunction(newPath) {
    new Promise<ServiceResult>((resolve, reject) => {
        if (newPath == 'SOMETHING') {
            resolve(true);
        } else {
            reject(false);
        }
    });
}

Любая помощь будет приветствоваться.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Для тех, кто ищет решение, я сделал это:

it('should return true', (**done**) => {
    const aPath = 'SOMETHING';
    component.path = aPath;
    component.openFolder = aPath;
    component.openBrowse().then((result) => {
        expect(component.path).toBe(Path);
        done();
    }
});
0 голосов
/ 25 февраля 2019

Вы должны использовать fakeAsync и tick (оба из @angular/core/testing).

it('should return true', fakeAsync(() => {
    const aPath = 'SOMETHING';
    component.path = aPath;
    component.openFolder = aPath;
    component.openBrowse();
    tick();
    expect(component.path).toBe(Path);
}));

fakeAsync заставляет тестовое тело работать в "специальной тестовой зоне fakeAsync".

tick "имитирует течение времени до завершения всех ожидающих асинхронных действий"

Так что если вы используете комбинацию из них, ваш асинхронный тест может выглядеть как синхронный.

Источник Angular - Тестирование асинхронное

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...