2016-08-25 1 views
0

Das folgende ist meine Modul- und Komponententesteinrichtung. Wenn ich versuche $ state zu setzen, wirft $injector.get("$state") den immer Spaß Unbekannten Anbieter: $ stateProvider < - $ Zustand Fehler und ich verstehe nicht warum.

angular.module("my-module", [ 
     //Third Party 
     "ui.bootstrap", 
     "ui.router", 
     "toaster", 
     "angular-loading-bar", 
     "ngAnimate", 
     "ngSanitize", 
     "ApplicationInsightsModule", 
     "pascalprecht.translate" 
]); 

describe("something descriptive and helpful",(): void => { 
    // a bunch of other service variables.... 
    var $state: any; 

    // I've tried with and without this line 
    beforeEach(() => angular.module("ui.router")); 

    beforeEach(() => { 

     angular.module("my-module"); 

     inject(($injector: ng.auto.IInjectorService): void => { 
      // a bunch of other service variable assignments 
      $state = $injector.get("$state"); 
     }); 
}); 
+0

Es sollte auch bemerkt werden, dass die Verwendung eines echten Router in Spezifikationen ist umständlich. Bleib bei $ stateProvider/$ state mocks, wann immer es möglich ist. – estus

+0

@estus also, wenn ich meine gesamte Route Konfiguration verspotten muss ... was ist der Sinn es zu testen? Ich schreibe den Code an diesem Punkt praktisch neu, oder? Scheint es nicht wert. – Yatrix

Antwort

2

Sie benötigen

angular.mock.module("my-module") 

rufen Sie das Modul zu laden.

+0

Ich habe versucht, nur mock und der $ -Zustand löst, aber dann ist keiner meiner UI-Router-Status verfügbar. '$ state.go (" home ")' funktioniert beispielsweise nicht. – Yatrix

+0

Es gibt nicht genügend Code, um zu verstehen, warum das passiert, aber das Gehen in einen Zustand ist nicht das, was Sie normalerweise in einem Komponententest tun. In der Regel testen Sie einen Controller, spionieren Sie den Dienst $ state.go() aus, und vergewissern Sie sich, dass (zum Beispiel) nach dem erfolgreichen Senden eines Formulars durch den Controller $ state.go() aufgerufen wird, um zur richtigen Adresse zu wechseln Zustand. –

+0

Entschuldigung, ich schätze, ein wenig Kontext würde helfen. Was ich versuche zu tun ist Unit-Test die Konfiguration. Also, wenn ich '$ state.go (" home ")' 'anrufe, kann ich' $ state.current.name' überprüfen oder überprüfen, dass die 'url ==" \ home "'. Das liegt außerhalb des Rahmens meiner Frage, also habe ich Ihre Antwort akzeptiert. Es ist nur ein Teil des Puzzles für mich, mit dem ich gekämpft habe. – Yatrix

1

Der spöttische Punkt $stateProvider und $state ist, Dienste von Drittanbietern zu stupfen und nur Ihren eigenen Code isoliert zu testen, wodurch die Anzahl der beweglichen Teile reduziert wird.

Es ist im Grunde

beforeEach(module("my-module", ($provide) => { 
    $provide.factory('$state', ($q) => ({ 
    go: jasmine.createSpy().andCallFake(() => $q.resolve()); 
    })); 
})); 

it('...', inject(($state, ...) => { 
    ... 
    expect($state.go).toHaveBeenCalledWith('stateName'); 
}); 

An diesem Punkt ui.router Modul nicht soll in getestete Module geladen werden, da es zusätzliche Anstoßen benötigen.

Siehe auch this answer für die Erklärung, wie $stateProvider Route Konfiguration getestet werden kann.

Verwandte Themen