0

我有一个名为 的服务MessageBarFactory,有一个void 名为 的方法addAlert()。我有一个单元测试,我不希望调用该方法,所以我只是按如下方式监视它:

spyOn(MessageBarFactory, 'addAlert'); // And do nothing

在我正在测试的代码库分支中,有两次连续调用此方法:

.
.
.
MessageBarFactory.addAlert('Patient ' + $scope.patientIn.name.firstName + ....);
MessageBarFactory.addAlert('An error occurred attempting to load the patient details ....);
.
.
.

为了确保遵循该分支,我正在测试该方法是否已被“调用”两次:

expect(MessageBarFactory.addAlert).toHaveBeenCalledTimes(2);

但是我收到一条消息,其中还涉及我的其他一些间谍在同一服务的其他方法中,例如clearAlertByName

Error: <toHaveBeenCalledTimes> : Expected a spy, but got Object({ alerts: [  ], addAlert: spy on addAlert, closeAlert: Function, clearAll: Function, clearAlertByName: spy on clearAlertByName, clearAllExceptForWidget: Function, clearAlertByNameByType: Function }).
.
.
.

现在,当然,我可以做类似的事情:

let counter = 0;
spyOn(MessageBarFactory, 'addAlert').and.callFake(
    function(){
        counter++;
    }
); 
.
.
.
expect(counter).toEqual(2);

但这有点不自然,并且需要您还放入一个假函数,这会增加 spy 的运行时开销(这不是测试上下文中最重要的一点,但仍然如此)。

我想看看我是否在想这个错误:toHaveBeenCalledWithTimes()与 spyed on 方法不兼容?我认为这正是您可能想要监视方法的原因。我在这里想念什么?作为参考,我使用的是 Jasmine 3.1.0,不幸的是,这对于这个项目来说是不可协商的,它有一个很大的向后兼容性重点。

4

0 回答 0