如何使用Jasmine单元测试Promise catch

时间:2018-11-17 00:32:09

标签: angular unit-testing promise jasmine angular-test

我有一个非常简单的函数load(),我正尝试使用Jasmine进行单元测试。 this.service.loadObject()返回Promise。

如果Promise被拒绝,我如何测试this.logService.error将被调用?

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

1 个答案:

答案 0 :(得分:1)

类似的事情应该起作用:

SUBJECT DATE   MARKS level
======= =====  ===== =====
     A  10/01  10    1
     B  10/02  20    1
     B  10/03  30    1
     B  10/04  30    2
     C  10/05  10    1
     C  10/06  20    1
     C  10/07  20    2
     C  10/08  20    3
     C  10/09  20    4
     C  10/10  30    1

我在这里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(); }); }); 是因为promise异步拒绝。但是Angular可以根据需要提供更干净的方法。

编辑:我尚未对此进行测试,但是基于下面的链接,结合使用setTimeoutfakeAsynctick应该可以:

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

flushMicroTasks