Примерно так должно работать:
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");
}));