toHaveBeenCalled在同一个spy上的两个Jasmine测试用例中不能正常工作。

问题描述 投票:0回答:1

我有一个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,而且它已经被调用过一次,这就造成了问题。

我可以知道我做错了什么吗?

javascript angularjs unit-testing jasmine karma-jasmine
1个回答
0
投票

我得到了根本原因。我在两个测试用例中使用了相同的spy。每当第二个测试用例启动时,spy调用已经发生了(在测试用例1中)。所以,在第二个测试用例中,当我期待spy call不会发生时,它已经发生了(在测试用例1中)。因此测试用例失败了。

解决方法很简单,我们必须在beforeEach部分重置spy call。

....
....

beforeEach(function () {
  UtilService.User.calls.reset();
});

....
....
© www.soinside.com 2019 - 2024. All rights reserved.