我有一个名为 的服务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,不幸的是,这对于这个项目来说是不可协商的,它有一个很大的向后兼容性重点。