我有一个组件,该组件的方法负责关闭对话框。对话框关闭方法返回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();
});
答案 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变量。