Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 角度测试:使用专用方法测试角度服务_Javascript_Angularjs_Unit Testing_Angular Services - Fatal编程技术网

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;
                }

            };