2015-02-17 13 views
12

Nella mia app Angular, il router UI risolve una promessa nel controller. Quando prova a testare questo controller, Karma si lamenta di un fornitore sconosciuto. Come faccio a iniettare un oggetto falso nel test per rappresentare questo oggetto risolutivo. CodiceAngular Jasmine UI router iniettare il valore di risoluzione nel test

mio app sembra qualcosa di simile:

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

Quando si tenta di eseguire i test ho l'errore

Unknown provider: allTemplatesProvider <- allTemplates <- QueriesCtrl 

ho provato la creazione di una spia e l'iniezione, ma questo non funziona . Ecco la mia prova in questo momento:

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

risposta

12

Poiché non v'è alcun percorso coinvolti in unit test che avrebbe dovuto iniettare il allTemplates come un oggetto normale con funzione di $controller. Puoi provare:

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

altro si può utilizzare l'$provide API per creare un servizio fittizio.

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

Fai da prima cosa nella vostra beforEach blocco.

+0

@ Chandermani, sono nuovo di mocha-Chai, potrebbe aiutare con un problema simile pubblicato all'indirizzo http://stackoverflow.com/questions/28606056/mocha-chai-test-case-for-angular-configuration-file – mayank

Problemi correlati