我有一个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
}
});
答案 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
}
});