Ich habe einige Probleme beim Testen des Routers in meiner Anwendung, die auf dem Angular UI-Router basiert. Ich möchte testen, ob Statusübergänge die URL entsprechend ändern (es wird später kompliziertere Tests geben, aber hier fange ich an.)
Hier ist der relevante Teil meines Bewerbungscodes:
angular.module('scrapbooks')
.config( function($stateProvider){
$stateProvider.state('splash', {
url: "/splash/",
templateUrl: "/app/splash/splash.tpl.html",
controller: "SplashCtrl"
})
})
Und der Testcode:
it("should change to the splash state", function(){
inject(function($state, $rootScope){
$rootScope.$apply(function(){
$state.go("splash");
});
expect($state.current.name).to.equal("splash");
})
})
Ähnliche Fragen zu Stackoverflow (und dem offiziellen Testcode des UI-Routers) legen nahe, dass das Aufrufen des Aufrufs $ state.go in $ apply ausreichen sollte. Aber ich habe das getan und der Zustand wird immer noch nicht aktualisiert. $ state.current.name bleibt leer.
Antworten:
Ich hatte auch dieses Problem und fand schließlich heraus, wie es geht.
Hier ist ein Beispielstatus:
Der folgende Komponententest behandelt das Testen der URL mit Parametern und das Ausführen der Auflösungen, die ihre eigenen Abhängigkeiten einfügen:
quelle
andReturn
wie im obigen Kommentar erwähnt. Mein $ state.current.name gibt jedoch eine leere Zeichenfolge zurück. Weiß jemand warum?$state.current.name
ist leere Zeichenfolge.$q
. Alles muss$q
Versprechen verwenden$rootScope.$digest()
, um alle Versprechen zu lösen. Mein Fall ist wahrscheinlich ziemlich einzigartig, aber ich dachte, ich würde ihn nur für den Fall teilen.Wenn Sie nur den Namen des aktuellen Status überprüfen möchten, ist die Verwendung einfacher
$state.transitionTo('splash')
quelle
Mir ist klar, dass dies ein wenig vom Thema abweicht, aber ich bin von Google hierher gekommen, um nach einer einfachen Möglichkeit zu suchen, die Vorlage, den Controller und die URL einer Route zu testen.
werde dir geben
in Ihren Tests.
Ihre Tests könnten also ungefähr so aussehen:
quelle
Für ein
state
das ohneresolve
:HINWEIS:-
Für einen verschachtelten Status müssen wir möglicherweise mehr als eine Vorlage angeben. Zum Beispiel. wenn wir eine verschachtelte Zustand haben
core.public.home
und jederstate
, das heißtcore
,core.public
undcore.public.home
hat sich zu einemtemplateUrl
definierten, werden wir hinzufügen müssen$templateCache.put()
für jeden Zustand dertemplateUrl
Schlüssel: -$templateCache.put('app/templates/template1.html'); $templateCache.put('app/templates/template2.html'); $templateCache.put('app/templates/template3.html');
Hoffe das hilft. Viel Glück.
quelle
Sie können
$state.$current.locals.globals
damit auf alle aufgelösten Werte zugreifen (siehe Codefragment).In UI-Router 1.0.0 (derzeit Beta) können Sie versuchen,
$resolve.resolve(state, locals).then((resolved) => {})
die Spezifikationen aufzurufen . Zum Beispiel https://github.com/lucassus/angular-webpack-seed/blob/9a5af271439fd447510c0e3e87332959cb0eda0f/src/app/contacts/one/one.state.spec.js#L29quelle
Wenn Sie an nichts im Inhalt der Vorlage interessiert sind, können Sie einfach $ templateCache verspotten:
quelle