角度测试:使用私有方法测试角度服务

时间:2014-01-20 09:16:44

标签: 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, 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;
                }

            };

1 个答案:

答案 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配置中作为包含文件(或者在任何其他框架中添加帮助器的方式)和一切都很完美