toHaveBeenCalled 无法在同一个间谍上使用两个 Jasmine 测试用例正常工作
toHaveBeenCalled is not working correctly with two Jasmine test cases on same spy
我有一个我在两个测试用例中使用过的间谍对象。我正在使用 toHaveBeenCalled 方法来检查间谍方法是否被调用。
我的代码在与一个测试用例一起使用时工作得非常好,但是当我使用两个使用相同间谍的测试用例时,它给出了错误的结果。
根据代码,它应该只在两个测试用例的第二次调用中调用间谍,但它在第二个测试用例中调用第一次调用。
我的源文件: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.
我想我在两个测试用例中都使用了相同的间谍程序,并且它已经被调用过一次,这是造成问题的原因。
请问我做错了什么吗?
我找到了根本原因。我在两个测试用例中都使用了相同的间谍。每当第二个测试用例开始时,间谍调用就已经发生(在测试用例 1 中)。所以在第二个测试用例中,当我期望间谍调用不会发生时,它已经发生了(在测试用例 1 中)。因此测试用例失败了。
解决方案非常简单,我们必须在 beforeEach 部分中重置间谍调用。
....
....
beforeEach(function () {
UtilService.User.calls.reset();
});
....
....
我有一个我在两个测试用例中使用过的间谍对象。我正在使用 toHaveBeenCalled 方法来检查间谍方法是否被调用。
我的代码在与一个测试用例一起使用时工作得非常好,但是当我使用两个使用相同间谍的测试用例时,它给出了错误的结果。
根据代码,它应该只在两个测试用例的第二次调用中调用间谍,但它在第二个测试用例中调用第一次调用。
我的源文件: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.
我想我在两个测试用例中都使用了相同的间谍程序,并且它已经被调用过一次,这是造成问题的原因。
请问我做错了什么吗?
我找到了根本原因。我在两个测试用例中都使用了相同的间谍。每当第二个测试用例开始时,间谍调用就已经发生(在测试用例 1 中)。所以在第二个测试用例中,当我期望间谍调用不会发生时,它已经发生了(在测试用例 1 中)。因此测试用例失败了。
解决方案非常简单,我们必须在 beforeEach 部分中重置间谍调用。
....
....
beforeEach(function () {
UtilService.User.calls.reset();
});
....
....