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

AngularJS下Jasmine校验被监听方法调用次数的报错问题

Jasmine 单元测试 toHaveBeenCalledTimes 报错问题解答

问题根因

你遇到的报错和toHaveBeenCalledTimes的版本兼容性无关,Jasmine 3.1.0完全支持该API,问题出在断言语句的入参错误。
从报错日志可以明确判断:toHaveBeenCalledTimes要求入参是被插桩的Spy对象,但你实际传入expect方法的是整个MessageBarFactory服务实例,而非服务下的addAlert这个Spy属性。大概率是编写断言时手误漏写了.addAlert,错误写成了expect(MessageBarFactory).toHaveBeenCalledTimes(2)。

正确写法

不需要额外通过callFake统计调用次数,默认的Spy插桩就自带调用计数能力,按如下方式编写即可:

  1. 插桩监听方法
// 无需添加额外回调,默认插桩就会自动统计调用次数、传参等信息
spyOn(MessageBarFactory, 'addAlert');
  1. 执行完业务逻辑后编写断言
// 注意expect入参是服务下的addAlert属性,不是服务本身
expect(MessageBarFactory.addAlert).toHaveBeenCalledTimes(2);

如果需要同时校验调用传参,可以搭配Spy的调用记录属性使用:

// 校验第一次调用的传参包含指定内容
expect(MessageBarFactory.addAlert.calls.first().args[0]).toContain('Patient ');
// 校验第二次调用的传参包含指定内容
expect(MessageBarFactory.addAlert.calls.mostRecent().args[0]).toContain('An error occurred');

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 12:15:05