Testen eines Angular Controllers, der Datatables verwendet - Mocking von DTOptionsBuilder und DT ColumnBuilder

9

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!

    
kabibster 09.07.2015, 21:19
quelle

1 Antwort

0

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.

%Vor%

Wenn Sie den Rückgabewert dieser Funktion manipulieren wollten, würde ich sinonjs nehmen und es zu einem stub machen.

%Vor%

Nun, da Sie mit Versprechungen arbeiten, ist es ein bisschen komplizierter, aber die Grundlagen für das Veröffentlichen einer versprechungsbasierten Funktion wären:

  • Geben Sie $q in Ihre Spezifikationsdatei ein.
  • Sagen Sie der stub , dass sie $q.when(/** value **/) zurückgibt, wenn eine aufgelöste Zusage vorliegt.
  • Teilen Sie stub mit, dass $q.reject(/** err **/) zurückgegeben werden soll, wenn eine abgelehnte Zusage vorliegt.
  • Führen Sie $timeout.flush() aus, um alle verzögerten Aufgaben zu löschen.
  • Leiten Sie den 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.

    
Kasper Lewau 19.07.2015 10:25
quelle