我有一个spy对象,我在两个测试用例中使用过。我使用toHaveBeenCalled方法来检查spy方法是否被调用。
当使用一个测试用例时,我的代码工作得很好,但是当我使用两个测试用例时,我使用了同一个spy,它给出了不正确的结果。
根据代码,它应该只在两个测试用例的第二次调用中调用spy,但它在第二个测试用例中调用的是第一次。
我的源文件: MyService.js
...
this.setUserMethod1 = function () {
if(this.loggedIn) {
UtilService.User();
}
}
this.setUserMethod2 = function () {
if(this.loggedIn) {
UtilService.User();
}
}
...
我的规格文件: MyService.spec.js
var UtilService = jasmine.createSpyObj('UtilService', ['User']);
UtilService.User.and.callFake(function () {
return {
setUser: function(){}
};
});
describe('MyService', function () {
it('setUserMethod1 should do xyz', function () {
MyService.loggedIn = false;
MyService.setUserMethod1();
expect(UtilService.User).not.toHaveBeenCalled();
MyService.loggedIn = true;
MyService.setUserMethod1();
expect(UtilService.User).toHaveBeenCalled();
});
it('setUserMethod2 should do pqr', function () {
MyService.loggedIn = false;
MyService.setUserMethod2();
expect(UtilService.User).not.toHaveBeenCalled();
MyService.loggedIn = true;
MyService.setUserMethod2();
expect(UtilService.User).toHaveBeenCalled();
});
});
它给出了以下错误。
debug.html:38 Expected spy UtilService.User not to have been called.
我想我在两个测试用例中使用了相同的spy,而且它已经被调用过一次,这就造成了问题。
我可以知道我做错了什么吗?
我得到了根本原因。我在两个测试用例中使用了相同的spy。每当第二个测试用例启动时,spy调用已经发生了(在测试用例1中)。所以,在第二个测试用例中,当我期待spy call不会发生时,它已经发生了(在测试用例1中)。因此测试用例失败了。
解决方法很简单,我们必须在beforeEach部分重置spy call。
....
....
beforeEach(function () {
UtilService.User.calls.reset();
});
....
....