2015-05-19 3 views
5

Ho una configurazione come questa:

angular.module('myModule', ['ui.router']) 
.config(['$stateProvider', function($stateProvider) { 
    $stateProvider 
    .state('app.home', { 
     abstract: true, 
     url: '/home', 
     template: '<div>Foo Bar</div>' 
    }); 
}]); 

e una prova di unità utilizzando il gelsomino in questo modo:

'use strict'; 

describe('Module: myModule', function() { 
    var $rootScope, $state; 

    beforeEach(module('ui.router')); 
    beforeEach(module('myModule')); 

    beforeEach(inject(function(_$rootScope_, _$state_) { 
    $state = _$state_; 
    $rootScope = _$rootScope_; 
    })); 

    it('must have a route state for home', function(){ 
    console.log($state.get('app.home')); // this returns null 
    }); 
}); 

Comunque io impossibile ottenere lo stato nella configurazione per visualizzare l'array restituito da $state.get()

Ho anche controllato e il file contenente la configurazione è caricato ed è lì. Qualcuno può dire cosa sto facendo di sbagliato? Fondamentalmente voglio solo verificare se gli stati Mi aspetto sono esistenti nella configurazione di "MyModule"

risposta

9

In primo luogo, non è necessario questo

beforeEach(module('ui.router')); 

come modulo elenca come una dipendenza già.

La mia ipotesi è che non si sta introducendo nello stato genitore app in modo che lo stato app.home non venga creato.

Di 'il tuo stato app è definito in myAppModule, è sufficiente modificare la vostra linea module a

beforeEach(module('myAppModule', 'myModule')); 

Se non si desidera includere il modulo con lo stato app, includono una funzione di configurazione prima il tuo modulo che crea uno stato genitore falso. Per questo, è necessario includere ui.router.

beforeEach(module('ui.router', function($stateProvider) { 
    $stateProvider.state('app', { abstract: true }); 
}, 'myModule')); 

alternativa, è possibile spiare $stateProvider.state e utilizzare un expect per assicurarsi che è stato richiamato con app.home, ad esempio

var $stateProvider; 

beforeEach(module('ui.router', function(_$stateProvider_) { 
    $stateProvider = _$stateProvider_; 
    spyOn($stateProvider, 'state'); 
}, 'myModule')); 

it('must have a route state for home', function() { 
    expect($stateProvider.state).toHaveBeenCalledWith('app.home', jasmine.any(Object)); 
}); 
+0

Sì, l'aggiunta di uno stato di genitore "app" sembra per risolvere il problema. Tuttavia aggiungere l'altro modulo come dipendenza non funzionerebbe sulla mia parte. Come potrei essere in grado di prendere in giro lo stato genitore solo sul test dell'unità, se è possibile? – reikyoushin

+0

Bello, grazie mille! – reikyoushin