【问题标题】:Angular how to write unit test for callback function in promiseAngular如何在promise中为回调函数编写单元测试
【发布时间】:2019-07-15 01:29:29
【问题描述】:

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

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

【问题讨论】:

  • 你能澄清一下 this.confirmationDialog 是什么吗?如果在测试中被模拟,那么请同时提供用作模拟的对象
  • 这值得单元测试吗?您的测试现在对代码有了深入的了解,坦率地说,仅仅因为您调用了一个名为 close 的方法,这并不意味着实际上已经关闭了任何东西。
  • 一切都值得测试。确认对话框实际上是确认对话框,而关闭是关闭该对话框的方法,它返回承诺,因为有关闭动画。关闭动画完成后,我正在为不同的操作传递一个回调函数。所以我认为对该调用进行单元测试非常重要。

标签: angular unit-testing promise jasmine


【解决方案1】:

如果您还没有这样做,您需要模拟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();
}));

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

【讨论】:

  • 谢谢。这与我找到的解决方案完全相同。
猜你喜欢
  • 2015-01-24
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 1970-01-01
相关资源
最近更新 更多