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();
});

....
....