2015-02-17 14 views
12

In meiner Angular App löst UI-Router ein Versprechen in den Controller. Beim Versuch, diesen Controller zu testen, beschwert sich Karma über einen unbekannten Anbieter. Wie injiziere ich ein falsches Objekt in den Test, um dieses Auflösungsobjekt darzustellen.Angular Jasmine UI Router injizieren Auflösung Wert in Test

Code Meine App sieht ungefähr so ​​aus:

angular.module('myapp') 
.config(function($stateProvider, $urlRouterProvider) { 
    $stateProvider 
    .state('tab.name', { 
     ... 
     resolve: { 
      allTemplates: function(Templates) { 
       return Templates.all().then(function(templates) { 
        return templates; 
       }); 
      } 
     } 
    }) 
}) 
.controller('QueriesCtrl', function(allTemplates, UserQuery) { 
    var vm = this; 
    vm.queries = allTemplates; 
    vm.goToUrl = function(index, data) { 
     var processedUrl = UserQuery.process(data, vm.queryTyped[index]); 
     UserQuery.goToUrl(processedUrl); 
    }; 
}); 

Beim Versuch, Tests ausführen ich den Fehler

Unknown provider: allTemplatesProvider <- allTemplates <- QueriesCtrl 

Ich habe versucht, einen Spion zu schaffen und es injizieren, aber das funktioniert nicht . Hier ist mein Test im Moment:

describe('Unit: queriesCtrl', function() { 
    var controller, 
     scope, 
     UserQuery; 

    beforeEach(function() { 
     module('myapp'); 
     inject(function($injector) { 
      UserQuery = $injector.get('UserQuery'); 
      allTemplates = jasmine.createSpyObj('allTemplates', [{a:1}, {a:2}, {b:3}]); 
     }); 
    }); 

    describe('goToUrl', function() { 
     beforeEach(inject(function ($rootScope, $controller) { 
      scope = $rootScope.$new(); 
      controller = $controller('QueriesCtrl as ctrl', { 
       '$scope': scope 
      }); 
     })); 
     it('should call UserQuery.process()', function() { 
      spyOn(UserQuery, 'process'); 
      scope.ctrl.goToUrl(); 
      expect(UserQuery.process).toHaveBeenCalled(); 
     }); 
    }); 
}); 

Antwort

12

Da es keine Route in Unit-Test beteiligt ist, würde Sie die allTemplates als normales Objekt mit $controller Funktion injizieren müssen. Können Sie versuchen:

controller = $controller('QueriesCtrl as ctrl', { 
       '$scope': scope, 
       'allTemplates':allTemplates 
      }); 

Else können Sie die $provide API verwenden, um einen Dummy-Dienst zu erstellen.

module(function ($provide) { 
    $provide.value("allTemplates", {[{a:1}, {a:2}, {b:3}]}); 

Machen Sie es zuerst in Ihrem beforEach Block.

+0

@ Chandermani, ich bin neu in Mocha-Chai, könnte bitte helfen mit ähnlichen Problem bei http://StackOverflow.com/Questions/28606056/mocha-chai-test-case-for-angular-Configuration-file – mayank

Verwandte Themen