假设我在服务上使用了这种方法:
this.search = function (term) {
var deferred = $q.defer();
Restangular.all('search').getList(params)
.then(_onRestResult.bind(this, deferred))
.catch(_onRestError.bind(this, deferred));
return deferred.promise;
}
function _onRestResult(deferred, data) { // notice it isn't on the this
//doSomthing
}
但是进行基本测试。
当我将then
子句更改为匿名函数时,一切都按预期工作,但当我使用命名的私有函数时,我得到:
因果打印:
TypeError:'undefined'不是一个函数(评估 '_onRestResult.bind(此,推迟)')
我知道这种answers
但它们指的是控制器而不是服务(:))并建议不使用私有方法,但我们更喜欢使用它们。
我也遇到this answer,这表明私有方法是隐式测试的,这是我的想法,直到我遇到这个错误消息。
感谢您的帮助!
编辑:我应该注意到我正在嘲笑像这样的Restangular(如果这是相关的):
mockRestangular = {
one:function(){
return this;
},
getList:function(calls){
answer ={results:['1','2']}
var deferred = $q.defer();
deferred.resolve(answer);
return deferred.promise;
},
post:function(called){
answer = 'posted: '+called;
var deferred = $q.defer();
deferred.resolve(answer);
return deferred.promise;
},
get: function(called){
answer = this;
var deferred = $q.defer();
deferred.resolve(answer);
return deferred.promise;
},
all:function(){
return this;
}
};
答案 0 :(得分:3)
答案:这是一个完全不同的问题。模糊的业力/柴错误信息使我走错了方向。实际问题(如果有人再遇到这个问题,我相信他们会......)是bind
方法。结果是phantomjs```` The headless browser we are running the tests with, Doesn't support
bind```(和其他一些es5方法一样,不是全部)。使用chrome / firefox运行相同的测试非常有效。一旦我理解这是问题,那么解决很容易,只需将一个ES5-shim lib(包括bind)添加到karma.conf.js配置中作为包含文件(或者在任何其他框架中添加帮助器的方式)和一切都很完美