【发布时间】:2014-02-09 09:25:23
【问题描述】:
假设我在服务上得到了这种方法:
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(this,deferred)')
我知道这种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;
}
};
【问题讨论】:
-
你能用示例代码创建一个 plunkr 吗?
-
您能否添加示例
then以及适合您的匿名函数? -
我创建了一个小提琴jsfiddle.net/6aUDu/3 我想这就是你所描述的,但它似乎对我有用。你能提供一个坏掉的小提琴吗?
-
@hassassin,感谢您的努力!我认为您在我的问题上遗漏了一些东西,因为小提琴没有在角度单元测试(业力/茉莉花或其他)中运行。正如我在问题中所说 - 使用私有方法在服务它本身中起作用。问题在于测试它。
标签: javascript angularjs unit-testing angular-services