如何在不使用 Angular 的 spyOn 的情况下检查服务中的方法是不是在 Jasmine 单元测试中被调用?
Posted
技术标签:
【中文标题】如何在不使用 Angular 的 spyOn 的情况下检查服务中的方法是不是在 Jasmine 单元测试中被调用?【英文标题】:How to check if a method from a service is called or not in Jasmine unit testing without using spyOn in Angular?如何在不使用 Angular 的 spyOn 的情况下检查服务中的方法是否在 Jasmine 单元测试中被调用? 【发布时间】:2020-11-20 02:19:07 【问题描述】:我有一个方法说 performAnalytics() 在服务中说 analyticsService 当您单击 html 中的特定元素时调用该方法。
我正在编写单元测试用例并尝试使用 jasmine 覆盖代码。
我触发了 HTML 元素的点击事件
testElement.dispatchEvent(new Event('click'));
。
performAnalytics() 被调用代码覆盖成功。
performAnalytics 方法形成一个对象,然后从其他服务调用另一个方法。
现在我想写一个期望如下
expect(analyticsService.performAnalytics()).toHaveBeenCalled()
为此,我需要在方法上使用 spyOn,如下所示
spyOn<any>(analyticsService, 'performAnalytics');
但如果我使用 spyOn,方法 performAnalytics 将被模拟,不会真正执行。因此 performAnalytics() 方法的代码覆盖不成功。
请帮忙。我是 Angular 的新手。 spyOn 的任何其他替代方法可以使用 toHaveBeenCalled() 吗?
如果我不写期望,而只是触发点击事件来覆盖代码,它将显示警告为“SPEC HAS NO EXPECTATIONS”
【问题讨论】:
【参考方案1】:保留您的 expect
并使用 callThrough 监视并将调用委托给实际实现:
spyOn<any>(analyticsService, 'performAnalytics').and.callThrough();
【讨论】:
以上是关于如何在不使用 Angular 的 spyOn 的情况下检查服务中的方法是不是在 Jasmine 单元测试中被调用?的主要内容,如果未能解决你的问题,请参考以下文章
来自 node_modules 的 Angular 单元测试 spyOn 类