1

假设我在服务上得到了这种方法:

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)')

我知道这种答案

但它们指的是控制器而不是服务 (:)) 并建议不要使用私有方法,但我们真的更喜欢使用它们。

我也遇到了这个答案,暗示私有方法已经过隐式测试,这就是我的想法,直到我遇到这个错误消息。

谢谢您的帮助!

编辑:我应该注意到我像这样嘲笑 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;
                }

            };
4

1 回答 1

3

答:这变成了一个完全不同的问题。模糊的业力/柴错误信息将我引向错误的方向。实际的问题(如果有人再次遇到这个问题,我相信他们会......)是bind方法。原来是phantomjs```` The headless browser we are running the tests with, Doesn't supportbind```(和其他一些es5方法一样,不是全部)。使用 chrome/firefox 运行相同的测试效果很好。一旦我明白这是问题所在,那么解决起来就很容易了,只需将一个 ES5-shim 库(包括绑定)添加到 karma.conf.js 配置中作为一个包含文件(或在任何其他框架中添加帮助程序的方式)和一切正常

于 2014-01-24T13:26:53.500 回答