如何使用茉莉花单元测试无极抓(How to unit test Promise catch usin

2019-11-05 07:25发布

我有我试图用茉莉花单元测试一个很简单的功能负荷()。 this.service.loadObject()返回一个承诺。

如何测试,如果承诺被拒绝this.logService.error会叫什么名字?

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

Answer 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();
    });
});

我在做setTimeout这里,因为承诺异步拒绝。 但是,角有这样做的,如果你需要的更清洁的方式。

编辑 :使用我没有测试过这一点,但基于以下链接, fakeAsync连同要么tickflushMicroTasks应该工作:

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");
}));


文章来源: How to unit test Promise catch using Jasmine