Использование tick () после вложенного обещания не приводит к ожиданию завершения обещаний (Карма / Жасмин) - PullRequest
0 голосов
/ 27 ноября 2018

Мне нужно создать тестовую спецификацию в Angular, которая проверяет, что строка base64 конвертируется в объект Blob.Процесс преобразования включает в себя вложенные обещания:

fetch(testImage1).then(res => res.blob()).then(blob => {});

Я тестирую этот процесс, используя эту спецификацию:

it( 'should update an image fakeAsync', fakeAsync( () => {
    fixture.detectChanges();
    let imgBlob = null;
    // testImage1 = 'data:image/gif;base64,R0lGODlhPQBEAPeoAJosM//AwO/AwHVYZ/z5......'
    fetch(testImage1).then(res => res.blob()).then(blob => {
        imgBlob = blob;
        expect(imgBlob).toBeTruthy(); //OK
    });
    tick();
    expect(imgBlob).toBeTruthy(); //test fails
} ));

Как показывает код, спецификация запускается в блоке fakeAsync и вызывается метод tick ()после асинхронного вызова кода.imgBlob должен быть установлен после того, как функция блокировки tick () освобождает поток программы.Но вместо этого поток программы не останавливается, второе ожидание проверяется до завершения асинхронных вызовов.Это приводит к сбою спецификации.

Angular CLI 6.2.6, Karma 3.1.1, Jasmine 2.8.0

В качестве обходного пути это работает:

let promise = new Promise((resolve, reject) => {
        fetch(testImage1).then(res => res.blob()).then(blob => {
            resolve(blob);
        });

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