Ich versuche, alle Tests aus mehreren Dateien in einer Datei zusammenzuführen.
describe('Controllers', function() {
describe('messages.js', function() {
require('./controllertests/messages').test(options);
})
describe('users.js', function() {
require('./controllertests/users').test(options);
})
})
Ich bin mir ziemlich sicher, dass dies nicht der beste Weg ist, um an Tests teilzunehmen. Ich habe einige Schwierigkeiten, Beispiele dafür zu finden: s
node.js
unit-testing
mocha
coiso
quelle
quelle
.only()
umgeht, kann es hilfreich sein,describe.only()
ein ganzes Verzeichnis von Tests ausführen zu können . Das hat mich hierher gebracht.Antworten:
Wenn Sie mehrere Module in Ihre
describe
Hierarchie aufnehmen möchten, wie Sie es in Ihrer Frage tun, tun Sie dies so ziemlich, es sei denn, Sie möchten einen benutzerdefinierten Testlader für Mocha schreiben. Das Schreiben des benutzerdefinierten Loaders wäre nicht einfacher oder macht Ihren Code klarer als das, was Sie bereits haben.Hier ist ein Beispiel, wie ich ein paar Dinge ändern würde. Das
test
Unterverzeichnis in diesem Beispiel ist wie folgt organisiert:top.js
::Die
importTest
Funktion soll nur zeigen, wie es möglich wäre, die Wiederholung des Imports mehrerer Module zu handhaben, ohne dasdescribe(... require...
Ganze jedes Mal neu eingeben zu müssen . Dascommon
Modul soll enthalten, was Sie in mehreren Modulen der Testsuite verwenden müssen. Ich benutze es nicht wirklich intop
aber es könnte dort verwendet werden, wenn nötig.Ich werde hier bemerken, dass der
beforeEach
Code vor jedem einzelnen Test ausgeführt wird, der registriert wird,it
ob er imdescribe
Intop
oder in einem der importierten Module erscheint . Mit müsste--recursive
derbeforeEach
Code in jedes Modul kopiert werden, oder Sie hättenbeforeEach
in jedem Modul einen Hook, der eine aus einem gemeinsamen Modul importierte Funktion aufruft.Außerdem wird der
after
Hook nach allen Tests in der Suite ausgeführt. Dies kann nicht mit repliziert werden--recursive
. Wenn Sie--recursive
den Codeafter
jedes Moduls verwenden und hinzufügen , wird er einmal pro Modul und nicht nur einmal für das gesamte Modul ausgeführt Test ausgeführt.Wenn alle Tests unter einer einzigen
top
Überschrift angezeigt werden, kann dies nicht mit repliziert werden--recursive
. Mit--recursive
jeder Datei könntedescribe("top"
aber dies würde eine neuetop
Überschrift für jede Datei erstellen.common.js
::Die Verwendung eines Moduls mit
common
diesem Namen habe ich in einigen meiner Testsuiten durchgeführt, um zu vermeiden, dass immer wiederrequire
eine Menge Dinge erledigt werden müssen, und um globale schreibgeschützte Variablen oder Funktionen zu speichern, die den Status nicht beibehalten. Ich ziehe es vor, das nicht zu verschmutzenglobal
Objekt nicht wie in der Antwort von thgaskell , da dieses Objekt wirklich global ist und auch in Bibliotheken von Drittanbietern zugänglich ist, in die Ihr Code möglicherweise geladen wird. Dies ist in meinem Code nicht akzeptabel.a/a.js
::b/b.js
::quelle
global
Umfang nicht verschmutzen sollten , aber ich verwende dies für die Assertionsbibliotheken, um die Testdateien sauberer zu halten. Es ist nicht so, als würdest du überschreibenglobal.process
. Lokale Variablen werden überschrieben, esglobal
sei denn, andere Bibliotheken rufen explizit auf,global.XYZ
was unwahrscheinlich ist. Es dauert nur für die Dauer der Tests. Hat mich noch nicht verletzt, aber ich werde dich wissen lassen, sobald es mich in den Arsch beißt :)importTest
und Anrufrequire('path')()
zum Beispiel?importTest
Funktion ist nur eine Komfortfunktion. Das Wichtigste dabei ist, denrequire
Aufruf in einendescribe
Block zu packen. Es ist wichtig, dass derrequire
Aufruf eingeschlossen wird, dadescribe
sonst die Module nicht in einem eigenen Block isoliert werden und alle von der importierten Datei gesetzten Hooks auf den falschen Block gesetzt werden. WennimportTest
durch einen direkten Aufrufrequire
ohne Umbruch ersetzt würdedescribe
, würden sich die Modulea/a
undb/b
Hooks teilen. Zum Beispiel würde vor jedem Test einbeforeEach
Hook-b/b
In ausgeführta/a
.Obwohl dies möglicherweise nicht direkt mit der Frage zusammenhängt, war die Antwort, nach der ich gesucht habe:
Führt alle Tests in Unterverzeichnissen des Ordners "test" aus. Ordentlich. Spart die Notwendigkeit, eine Liste von Tests zu führen, die ich laden möchte, und eigentlich immer alles auszuführen.
quelle
describe
Blöcke einschließen möchten , werdendescribe
Blöcke, die sich über mehrere Dateien erstrecken, dies--recursive
nicht tun. Da es das Problem des OP nicht löst, würde ich es nicht als "am besten" bezeichnen.describe
Blöcke verpackendescribe
Block abzudecken . Schau dir die Frage an. Derdescribe
Block "Controller" sollte die Tests von./controllertests/messages.js
und umfassen./controllertests/users.js
. Wenn Sie--recursive
auf einen Mokka-Aufruf klatschen, wird auf magische Weise keindescribe("Controllers"
Block erstellt.describe
Blöcke zu erstellen - was ich tatsächlich von Dumbledore selbst gelernt habe.Nichts hindert Sie daran, mehrere Testdateien auszuführen. Im Allgemeinen sollte jeder Test nicht von den Ergebnissen eines anderen Tests abhängig sein, sodass Sie keine Variablen gemeinsam nutzen möchten.
Hier ist ein Beispiel, wie Sie Ihre Testdateien organisieren können.
Stellen Sie dann in Ihrer
mocha.opts
Datei sicher, dass Sie die--recursive
Option festlegen .mocha.opts
Wenn es gibt gemeinsame Module , dass Sie über alle Dateien aufnehmen möchten, können Sie dies mit dem Add -
common.js
Datei. Dateien im Stammverzeichnis destest
Verzeichnisses werden vor Dateien in verschachtelten Verzeichnissen ausgeführt.common.js
quelle
describe('mytest', function() { /* ..... etc */ });
Ich weiß, dass dies ein alter Beitrag ist, aber ich wollte mich auf eine für mich gute Lösung einlassen, die der von OP vorgeschlagenen Methode sehr ähnlich ist.
Das Projekt, an dem ich arbeite, ist gut getestet und die Tests wachsen weiter. Ich habe es letztendlich verwendet,
require
weil es synchron ist und es daher ein bisschen einfacher macht, Ihre Tests ohne zu große Änderungen in der Architektur zu erstellen:quelle
Ich hatte ein ähnliches Problem, bei dem ich eine Reihe von Tests für Klassen in derselben Kategorie hatte, und ich wollte sie zusammenfassen, um das Anzeigen in einer IDE zu vereinfachen. Alle meine Tests und mein Code verwendeten bereits ES6-Module - ich wollte nicht alle neu schreiben, um sie
require
wie in anderen Beispielen zu verwenden.Ich habe es gelöst, indem ich meine "Gruppierung"
describe
exportiert und dann in meine Testdateien importiert und programmgesteuert zu den importierten hinzugefügt habedescribe
. Am Ende habe ich eine Hilfsmethode entwickelt, um alle Klempnerarbeiten zu abstrahieren.In someCategory.spec.js
In Einzeltests:
quelle
quelle
./Test.js
? Wer weiß? Für die Aufzeichnung bin ich derzeit der beste Antwortende im Mokka- Tag. Ich kenne Mokka in- und auswendig, aber ich kann diese Antwort nicht verstehen.