当使用自己的方法时,AngularJS服务和模拟测试具有冲突的上下文?

时间:2016-07-12 11:02:32

标签: angularjs unit-testing mocking jasmine

我有一个AngularJS服务,它使用它自己的方法(不好的做法?)。当我去测试这个,并模拟出内部使用的方法时,我会得到冲突的上下文。

这是一个示例服务

angular.module('myModule', []).service('cardWarsService', function() {
    return {floopThePig:floopThePig,
            winAtCardWars:winAtCardWars};
    function winAtCardWars(cards){
      ....
      floopThePig(pigCard)
      ....
    };
    function floopThePig(card){
    // flooping happens here
    }
});

然而,当我试图模仿floopThePig时,我被告知它没有被召唤。这就是我嘲笑它的方式。

spyOn(cardWarsService, 'floopThePig').and.callThrough();

如果我将服务中的调用更改为使用this或使用var self = this,那么它适用于测试框工作但不适用于应用程序。

angular.module('myModule', []).service('cardWarsService', function() {
    var self = this;
    return {floopThePig:floopThePig,
            winAtCardWars:winAtCardWars};
    function winAtCardWars(cards){
      ....
      self.floopThePig(pigCard)
      ....
    };
    function floopThePig(card){
    // flooping happens here
    }
});

1 个答案:

答案 0 :(得分:0)

将您的返回对象作为独立变量放置。

问题是返回对象两侧的方法不同。您的测试仅模拟接口。由于您的应用程序没有使用界面,间谍不会接受它正在被使用。

这将保证我们的服务能够在测试框架内外工作

angular.module('myModule', []).service('cardWarsService', function() {
    var self = {floopThePig:floopThePig,
            winAtCardWars:winAtCardWars};
    return self;
    function winAtCardWars(cards){
      ....
      floopThePig(pigCard)
      ....
    };
    function floopThePig(card){
    // flooping happens here
    }
});