Angular如何在Promise中编写回调函数的单元测试

时间:2019-02-21 07:55:31

标签: angular unit-testing promise jasmine

我有一个组件,该组件的方法负责关闭对话框。对话框关闭方法返回promise。

closeDialogAction(callback: Function) {
    this.confirmationDialog.close(true).then(() => {
        callback();
    });
}

如何编写一个单元测试来检查我的回调是否被调用? 我曾尝试过这种方法,但没有成功。

it('should call callback function after close dialog', () => {
    const cb = jasmine.createSpy('cb');
    this.componentInstance.closeDialogAction(cb);
    expect(cb).toHaveBeenCalled();
});

1 个答案:

答案 0 :(得分:0)

如果尚未执行此操作,则需要模拟ConfirmationDialog的close()函数,以便它立即返回已解决的Promise

由于您正在处理异步代码,因此必须在it调用中包装fakeAsync的断言函数。这会将您的断言代码包装在一个特殊的测试区域中,该区域为您模仿异步行为(有关更多信息,请参见the fakeAsync documentation)。然后,您只需要调用tick来“提前(虚拟)时钟”。这样可以确保所有异步活动都将在此调用之后完成。

这大致就是您的代码的外观:

 
it("should call callback", fakeAsync(() => {
    //todo: confirmationDialog should be injected by you via TestBed.get() or something similar
    spyOn(confirmationDialog, "close").and.returnValue(Promise.resolve(true));
    const spy = jasmine.createSpy();

    closeDialogAction(spy);

    tick();

    expect(spy).toHaveBeenCalled();
}));

请注意,取决于您的代码库,您需要通过注入或手动创建来实例化confirmationDialog变量。