我有一个非常简单的函数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));
}
答案 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可以根据需要提供更干净的方法。
编辑:我尚未对此进行测试,但是基于下面的链接,结合使用setTimeout
和fakeAsync
或tick
应该可以:
https://www.joshmorony.com/testing-asynchronous-code-with-fakeasync-in-angular/ https://alligator.io/angular/testing-async-fakeasync/
flushMicroTasks