如何在不使用 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 类

开玩笑 - 使用 spyOn 函数时,确保不调用被监视的函数

spyOn 找不到用于监视 start() 的对象

Jasmine spyOn 函数和返回对象

Jasmine spyOn 多次返回

间谍服务在spyOn时变为未定义