Ich versuche, einen Test für einen Angular-Controller zu schreiben, der hauptsächlich eine Datentabelle mit Werten vom Server erstellt. Ich habe versucht, DTOptionsBuilder und DTColumnBuilder zu verspotten, aber das scheint nicht zu funktionieren. Ich bekomme den Fehler:
'undefined' ist kein Objekt (Bewertung 'DTOptionsBuilder.fromFnPromise (function () { Rückgabe MarketsFactory.getAll (); }) .withDataProp ')
Hier ist der Controller-Code:
%Vor%Und die Testdatei:
%Vor%Ich dachte, dass das Erstellen eines Spottes und das Setzen eines Spions es daran hindern würde, die verketteten Funktionen aufzurufen, aber ich denke nicht.
Ich bin ziemlich neu beim Testen, besonders bei Angular, also würde jede Hilfe im Allgemeinen sehr geschätzt werden!
Ich nähere mich dem von einem sinonjs / Mokka Hintergrund
Ich habe Probleme, Ihren beforeEach-Block zu entschlüsseln - aber es kann bis zu einem gewissen Grad vereinfacht werden:
%Vor% Die Art von spy
ist die, dass die ursprüngliche Implementierung ihre Sache macht, aber alle Aufrufe dieser Funktion und eine Auswahl von zugehörigen Daten aufzeichnet.
A stub
andererseits ist ein spy
mit einer erweiterten API, wo Sie die Funktionen dieser Funktion vollständig ändern können. Rückgabewert, erwartete Parameter usw. usw.
Angenommen, wir hätten den oben genannten beforeEach-Block verwendet, wäre DTOptionsBuilder.fromFnPromise
zu diesem Zeitpunkt ein noop
. Daher wäre es sicher, spy
darauf zu setzen und zu erwarten, dass die Methode aufgerufen wurde.
Wenn Sie den Rückgabewert dieser Funktion manipulieren wollten, würde ich sinonjs nehmen und es zu einem stub
machen.
Nun, da Sie mit Versprechungen arbeiten, ist es ein bisschen komplizierter, aber die Grundlagen für das Veröffentlichen einer versprechungsbasierten Funktion wären:
$q
in Ihre Spezifikationsdatei ein. stub
, dass sie $q.when(/** value **/)
zurückgibt, wenn eine aufgelöste Zusage vorliegt.
stub
mit, dass $q.reject(/** err **/)
zurückgegeben werden soll, wenn eine abgelehnte Zusage vorliegt.
$timeout.flush()
aus, um alle verzögerten Aufgaben zu löschen. done
-Rückruf aus, um Jasmine zu benachrichtigen, dass Sie fertig sind und auf asynchrone Aufgaben warten (ist möglicherweise nicht erforderlich). Dies hängt vom Test Framework / Runner ab. Es könnte so aussehen:
%Vor%Nun, vieles davon ist nur Vermutungen an dieser Stelle. Es ist ziemlich schwierig, eine voll funktionsfähige Testsuite einzurichten, ohne dass der Quellcode direkt neben mir als Querverweis läuft, aber ich hoffe, dass Sie damit zumindest ein paar Ideen bekommen, wie Sie mit Ihren Spionen und Stubs weitermachen können.
Tags und Links angularjs unit-testing jasmine datatable