2013-05-18 2 views
13

Lottare per ottenere il test dell'unità impostato in Jasmine/Karma. Ho un controller con una dipendenza dal servizio e quel servizio ha un'altra dipendenza dal servizio. Non sto organizzando i miei moduli per tipo (direttive, servizi, ecc.), Ma piuttosto per funzionalità (layout, summaryView, ecc.).Test modulare AngularJS w/Jasmine & Karma

Ecco l'architettura:

angular.module('myApp', ['ngResource', 'myApp.base', 'myApp.layout','myApp.common']); 
angular.module('myApp.base', ['myApp.common']); 
angular.module('myApp.common',[]); 
angular.module('myApp.layout',['myApp.common']); 

Controller:

angular.module('myApp.layout') 
    .controller('LayoutCtrl', ['$scope', '$rootScope', '$timeout', 'layoutService', 'urlService', 'BaseService', 
     function ($scope, $rootScope, $timeout, layoutService, urlService, BaseService) { 
      //controller code here 
    }); 

Servizio Disposizione:

angular.module('myApp.layout') 
    .service('layoutService', ['$http', '$resource', '$rootScope', '$location', '$route', 'errorHandlingService', 'utilService', 
     function ($http, $resource, $rootScope, $location, $route, errorHandlingService, utilService) { 
      //service code here 
    }); 

Da quanto ho capito, se ho semplicemente includo beforeEach(module('myApp.layout'));, dovrei avere accesso ai i miei controller, servizi, filtri e direttive nel mio modulo di layout.

invece, il seguente codice fallisce:

describe('Layout Controller', function() { 
    var ctrl, scope, service; 

    beforeEach(module('myApp')); 
    beforeEach(module('myApp.layout')); 
    beforeEach(inject(function($controller, $rootScope, layoutService) { 

     scope = $rootScope.$new(); 
     service = layoutService; 
     //Create the controller with the new scope 
     ctrl = $controller('LayoutCtrl', {$scope: scope, layoutService: service}); 
     dump(scope); 
    })); 
    it('should exist', function() { 
     expect(ctrl).toBeDefined(); 
    }); 
}); 

Con questo errore:

Chrome 26.0 (Mac) Layout Controller should exist FAILED 
    Error: Unknown provider: layoutServiceProvider <- layoutService 
     at Error (<anonymous>) 
     at http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.min.js:28:236 
     at Object.c [as get] (http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.min.js:26:13) 
     at http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.min.js:28:317 
     at c (http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.min.js:26:13) 
     at Object.d [as invoke] (http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.min.js:26:147) 
     at workFn (http://code.angularjs.org/1.0.4/angular-mocks.js:1754:20) 
    Error: Declaration Location 
     at window.jasmine.window.inject.angular.mock.inject (http://code.angularjs.org/1.0.4/angular-mocks.js:1740:25) 
     at null.<anonymous> (/Users/scottsilvi/svn/BARO/web/src/test/js/unit/myApp.layoutModule.js:6:14) 
     at /Users/scottsilvi/svn/BARO/web/src/test/js/unit/myApp.layoutModule.js:1:1 
    Expected undefined to be defined. 
    Error: Expected undefined to be defined. 
     at null.<anonymous> (/Users/scottsilvi/svn/BARO/web/src/test/js/unit/myApp.layoutModule.js:15:16) 
Chrome 26.0 (Mac): Executed 10 of 10 (1 FAILED) (0.36 secs/0.014 secs) 

Pensieri?

+2

Sei sicuro che tutti i file vengono caricati e vengono caricati nell'ordine corretto? – Jmr

+0

sì che si è rivelato essere il problema. Alcune delle dipendenze nel modulo myApp non venivano caricate. Non appena li ho caricati tutti, i test hanno iniziato a funzionare. Vai avanti e invia una risposta e segnerò come corretta. Grazie. –

risposta

10

Spesso un errore di Provider sconosciuto deriva da file non caricati o caricati nell'ordine errato. Verifica quali file sono presenti durante l'esecuzione dei test.

+3

Solo per aggiungere a questo mi mancava un 's' nel mio servizio. ughh ... –

+4

@Jmr come si rileva quali file sono presenti durante l'esecuzione dei test? –

+0

@GeorgeStocker Esegui karma con logLevel DEBUG – Jay

0

Questo tipo di errori si verificano principalmente a causa di errata dichiarazione di file all'interno del file karma.config.js. Per l'installazione di karma-jasmine tutti i file all'interno del blocco file:[] di karma.config.js devono essere in sequenza in cui devono essere caricati. Il modulo principale sta eseguendo l'iniezione di dipendenza di qualsiasi servizio personalizzato, quindi carica prima quel servizio e poi il modulo principale.