如何在 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?

我在服务中有一个方法 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'

保持你的 expect 不变,并使用 callThrough 来监视和委托对实际实现的调用:

spyOn<any>(analyticsService, 'performAnalytics').and.callThrough();