【问题标题】:Angular testing: testing angular Services with private methodsAngular 测试:使用私有方法测试 Angular 服务
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2022-01-21
    • 2023-01-30
    • 1970-01-01
    • 2020-03-12
    • 2013-11-08
    • 2018-08-25
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多