Как выполнить юнит-тест Promise catch с использованием жасмина - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть очень простая функция load (), которую я пытаюсь выполнить с помощью Jasmine.this.service.loadObject () возвращает Promise.

Как проверить, будет ли вызываться this.logService.error в случае отклонения Promise?

load() {
    this.service.loadObject().then(x => {
       this.variable = x;
    }).catch(ex => this.logService.error(ex));
}

1 Ответ

0 голосов
/ 17 ноября 2018

Примерно так должно работать:

it("should catch the error", done => {
    spyOn(service, "loadObject").and.returnValue(Promise.reject("test error"));
    spyOn(logService, "error"); // Might need to mock this method too

    load();

    setTimeout(() => {
        expect(logService.error).toHaveBeenCalledWith("test error");
        done();
    });
});

Я делаю setTimeout здесь, потому что обещание отклоняется асинхронно. Но у Angular есть более чистые способы сделать это, если вам нужно.

Редактировать : Я не проверял это, но на основе ссылок ниже, использование fakeAsync в сочетании с tick или flushMicroTasks должно работать:

https://www.joshmorony.com/testing-asynchronous-code-with-fakeasync-in-angular/ https://alligator.io/angular/testing-async-fakeasync/

it("should catch the error", fakeAsync(() => {
    spyOn(service, "loadObject").and.returnValue(Promise.reject("test error"));
    spyOn(logService, "error"); // Might need to mock this method too

    load();

    // One of these
    // flushMicroTasks();
    // tick();

    expect(logService.error).toHaveBeenCalledWith("test error");
}));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...