简体   繁体   中英

Angular testing: testing angular Services with private methods

lets say I got this kind of method on a service:

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
}

But running a basic test.

when I change the then clause to an anonymous function, everything works as expected, but when I used the named private function I get: karma prints:

TypeError: 'undefined' is not a function (evaluating '_onRestResult.bind(this,deferred)')

I'm aware of this kind of answers

but they refer to controllers and not services (:)) and suggest not using private methods, but we really prefer using them.

I also run into this answer that suggests the private methods are implicitly tested, which was what I thought, until I run into this error messages.

Thanks for the help!

EDIT: I should notice I'm mocking Restangular like this (if this is relevant):

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

            };

Answer: This turned to be a completely different problem. Vague karma/chai error messages led me in the wrong direction. The actual problem (if someone bumps into this issue again, which I believe they will..) is the bind method. Turned out the phantomjs```` The headless browser we are running the tests with, Doesn't support bind``` (as some other es5 methods, not all). Running the same tests with chrome/firefox works perfectly. Once I understood this was the problem, then solving was easy, just added an ES5-shim lib (that included bind) to the karma.conf.js configuration as an included file (or the way you add helpers in any other framework) and everything works perfectlly

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM