Javascript 角度测试:使用专用方法测试角度服务
假设我在一个服务上得到了这种方法:Javascript 角度测试:使用专用方法测试角度服务,javascript,angularjs,unit-testing,angular-services,Javascript,Angularjs,Unit Testing,Angular Services,假设我在一个服务上得到了这种方法: this.search = function (term) { var deferred = $q.defer(); Restangular.all('search').getList(params) .then(_onRestResult.bind(this, deferred)) .catch(_onRestError.bind(this,
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:“未定义”不是函数(正在计算
“_onresult.bind(this,deferred)”)
我知道这种情况
但它们指的是控制器而不是服务(:),并建议不要使用私有方法,但我们确实更喜欢使用它们
我还遇到了一个问题,它表明私有方法是隐式测试的,这就是我所想的,直到我遇到这个错误消息
谢谢你的帮助
编辑:我应该注意到我是这样嘲笑restanglar的(如果相关的话):
答:这是一个完全不同的问题。模糊的因果报应/错误信息将我引向了错误的方向。实际问题(如果有人再次碰到这个问题,我相信他们会……)是
bind
方法。原来运行测试的无头浏览器phantomjs````不支持
bind`````(与其他一些es5方法一样,不是全部)。在chrome/firefox上运行相同的测试非常有效。一旦我明白了这是个问题,那么解决起来就很容易了,只需在karma.conf.js配置中添加一个ES5垫片库(包括bind)作为一个包含的文件(或者您在任何其他框架中添加helpers的方式)一切都很完美你能用示例代码创建一个plunkr吗?你能添加示例然后用匿名函数为你工作吗?我创建了一个小提琴我想这就是你描述的,但它似乎对我有用。你能提供一把断开的小提琴吗?@hassassin,谢谢你的努力!我想你在我的问题中遗漏了一些东西,因为小提琴没有在角度单位测试中运行(karma/jasmine或其他)。正如我在问题中所说的,使用私有方法在It自身的服务中起作用。问题在于测试它。
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;
}
};