Wie kann ich meine Meteor-Methoden testen?

8

Ich habe einige Meteor-Methoden für meine Anwendung geschrieben, die verschiedene Bereiche der Geschäftslogik enthalten. Jetzt möchte ich Komponententests für diese Methoden schreiben. Mit Unit-Tests meine ich insbesondere schnelle Tests, die nicht:

  • Führen Sie XHRs oder
  • aus
  • Schreiben Sie in die Datenbank

Wie kann ich das tun? Mein aktueller Gedanke ist, dass wenn ich den Meteor Server in einer Testkonfiguration starte, ich meine Sammlungen durch Dummy-Sammlungen ersetzen (indem ich new Meteor.Collection(null) übergebe) und meine Komponententests auf der Serverseite ausführen lasse, wobei Meteor.call () aufgerufen wird von da aus meine Methoden. Ich bin nicht ganz sicher, wie ich die Tests starten würde, möglicherweise möchte ich eine benutzerdefinierte /tests URL in meiner Anwendung erstellen, die sie auslöst. Erscheint dieser Ansatz vernünftig? Gibt es irgendwelche Bibliotheken / Pakete, die Schreibgerätentests für meine Methoden erleichtern?

    
Derek Thurn 03.03.2013, 21:42
quelle

2 Antworten

1

Alles klar, hier ist, was ich entwickelt habe, um meine Methoden zu testen. Ich bin der Erste, der zugibt, dass es hier viel Raum für Verbesserungen gibt!

Erstens, in meiner server.coffee Datei habe ich den folgenden Code:

%Vor%

Zuallererst läuft dieser Code nur, wenn Meteor.settings ["test"] definiert wurde, was ich tun kann, wenn ich meine Tests lokal ausführe, was aber in der Produktion niemals wahr sein sollte. Dann durchsucht es das "tests" -Verzeichnis nach Javascript- oder coffeescript-Dateien (Unterverzeichnisse werden in meiner Implementierung nicht gesucht, aber es wäre einfach, dies hinzuzufügen) und fügt sie zu einer mocha -Instanz hinzu. Ich benutze die ausgezeichnete mocha JavaScript-Test-Bibliothek hier, kombiniert mit der chai Zusicherungsbibliothek.

Der gesamte Code ist in einen Meteor.startup -Aufruf eingeschlossen, so dass meine Komponententests beim Serverstart ausgeführt werden. Das ist besonders schön, weil Meteor meine Tests automatisch wiederholt, wenn ich meinen Code ändere. Aufgrund der Entscheidung, die Datenbank zu isolieren und keine XHRs auszuführen, laufen meine Tests in wenigen Millisekunden ab, was nicht sehr störend ist.

Für die Tests selbst muss ich

machen %Vor%

Um die Assertion-Bibliothek aufzurufen. Es gibt jedoch noch ein paar knifflige Probleme zu lösen. Zunächst einmal werden Meteor-Methodenaufrufe fehlschlagen, wenn sie nicht in eine Fiber eingewickelt sind. Ich habe derzeit keine sehr gute Lösung für dieses Problem, aber ich habe die Funktion itShould erstellt, um die it -Funktion von Mocha zu ersetzen und den Testkörper in eine Fiber zu legen:

%Vor%

Als nächstes gibt es das Problem, zu Testzwecken meine Sammlungen durch Scheinkollektionen zu ersetzen. Dies ist sehr schwierig, wenn Sie die Meteor-Standardmethode befolgen, Ihre Sammlungen in globale Variablen zu setzen. Wenn Sie jedoch Ihre Sammlungen Eigenschaften für ein globales Objekt erstellen, können Sie dies tun. Machen Sie Ihre Sammlungen einfach über myApp.Collection = new Meteor.Collection("name") . Dann können Sie in Ihren Tests eine before -Funktion verwenden, um die Sammlung auszuspielen:

%Vor%

Auf diese Weise wird Ihre Sammlung für die Dauer des Testlaufs verspottet, aber dann wird sie wiederhergestellt, sodass Sie normal mit Ihrer App interagieren können. Einige andere Dinge sind möglich, über eine ähnliche Technik zu verspotten. Zum Beispiel funktioniert die globale Meteor.userId() -Funktion nur für vom Client initiierte Anfragen. Ich habe tatsächlich einen Fehler gegen Meteor eingereicht, um zu sehen, ob sie eine bessere Lösung für dieses Problem bieten können, aber dafür Jetzt ersetze ich die Funktion einfach durch meine eigene Version zum Testen:

%Vor%

Dieser Ansatz funktioniert für einige Teile von Meteor, aber nicht für alle. Zum Beispiel habe ich noch keine Methode gefunden, Methoden zu testen, die this.setUserId aufrufen, weil ich nicht glaube, dass es eine gute Möglichkeit gibt, dieses Verhalten zu überspielen. Im Großen und Ganzen funktioniert dieser Ansatz jedoch für mich ... Ich liebe es, meine Tests automatisch wiederholen zu lassen, wenn ich den Code ändere, und Tests isoliert durchzuführen, ist im Allgemeinen eine gute Idee. Es ist auch sehr praktisch, dass Tests auf dem Server blockieren können, wodurch sie einfacher ohne Rückrufketten schreiben können. So würde ein Test aussehen:

%Vor%     
Derek Thurn 09.03.2013, 18:31
quelle
0

Ich habe Jasmin zum Testen einer größeren Meteor-Anwendung verwendet, an der ich arbeite. Es kann viel mehr als Unit-Tests und es funktioniert ziemlich gut. Ein Blogpost darüber ist auf meinen Todo lis. Fürs Erste kann ich dir dieses CoffeeScript geben:

%Vor%

Dieser Code wird in einem Browser ausgeführt. Es ist möglich, es in einer Casperjs-Instanz auszuführen, wenn Sie es skripten möchten. Da es auf dem Client eine Meteor-Initialisierung durchführt, führt es XHR- und Datenbankabfragen durch, aber Sie können problemlos Tests schreiben, die keine zusätzlichen Abfragen ausführen. Oder schreibe eine Teilmenge von Funktionen, die beim Besuch von / unitests ausgelöst werden

Unser Zeug ist noch nicht in Produktion, aber das Deployscript löscht einfach den obigen Jasmin-Code und alle *.spec.coffee -Dateien.

Ich möchte dies in Jenkins einbinden, um zu einem richtigen Continuous Integration Setup zu gelangen, habe aber noch keine Zeit gefunden, Jenkins mehr als nur die Grundlagen zu erstellen. Ich spielte auch Casperjs für Headless Browsing, was sehr gut funktionierte.

Sie können auch einen anderen Ansatz wählen, indem Sie Ihren Testcode in tests/ (nicht von Meteor) eingeben und dann require verwenden. Ich habe das schnell ausprobiert und fand es ziemlich langweilig.

    
guaka 04.03.2013 19:59
quelle

Tags und Links