You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jasmine/Karma下Angular测试函数内dialog.open调用spy未触发如何解决

问题根因
  • 错误Spy覆盖了原方法逻辑:你在测试中使用spyOn(component,'PasswordBox').and.callFake给PasswordBox方法本身加了间谍,这会直接替换掉该方法的原有实现,就算方法被调用,内部的dialog.open也不会执行。直接删除这行Spy代码即可。
  • 未触发PasswordBox执行:测试用例中既没有模拟触发该方法的UI交互(比如点击对应绑定的按钮),也没有手动调用component.PasswordBox(),方法全程未运行,dialog.open自然不会被调用。
  • 写法存在不规范问题:and.callFake需要传入自定义假实现作为参数,你此处未传参数属于语法错误;同时fakeAsync不需要和fixture.whenStable().then()混用,属于不必要的冗余异步写法。
修正后的测试用例

因为dialog.open属于同步调用,不需要额外处理异步逻辑,最简测试写法如下:

it('should trigger dialog.open when PasswordBox runs', () => {
  // 手动调用方法,若该方法由UI交互触发,也可替换为模拟点击等操作
  component.PasswordBox();
  // 验证调用次数
  expect(dialogSpy).toHaveBeenCalledTimes(1);
  // 可选:验证调用参数是否符合预期
  expect(dialogSpy).toHaveBeenCalledWith(PasswordComponent, {
    width: '600px',
    data: {
      userDetails: component.userData.email
    }
  });
});

如果PasswordBox是由页面点击事件触发,可替换手动调用步骤为交互模拟:

// 示例:假设绑定方法的按钮选择器为.btn-password
const passwordBtn = fixture.debugElement.query(By.css('.btn-password'));
passwordBtn.triggerEventHandler('click', null);
fixture.detectChanges();

内容的提问来源于stack exchange,提问作者user15030493

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 15:27:02