MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Woher Mocha weiß, welche Datei zuerst in der Testsuite geladen werden soll

Es gibt keine vorgegebene Reihenfolge, wie Mocha die Testdateien lädt.

Wenn Mocha ein Verzeichnis scannt Um darin Dateien zu finden, verwendet es fs.readdirSync . Dieser Aufruf ist ein Wrapper um readdir(3) , die selbst noch keine Ordnung garantiert. Nun, aufgrund einer Implementierungsmakel die Ausgabe von fs.readdir und fs.readdirSync wird unter Linux (und wahrscheinlich POSIX-Systemen im Allgemeinen) sortiert, aber nicht unter Windows . Außerdem ist es möglich, dass das sortierte Verhalten unter Linux irgendwann entfernt wird, weil die Dokumentation fs.readdir sagt ist nur readdir(3) und letzteres garantiert keine Ordnung. Es gibt ein gutes Argument dafür, dass das unter Linux beobachtete Verhalten ein Fehler ist (siehe das oben verlinkte Problem).

Beachten Sie, dass es einen --sort gibt Option, die Dateien sortiert, nachdem Mocha sie gefunden hat. Dies ist jedoch standardmäßig deaktiviert.

Das von Ihnen beobachtete Verhalten lässt sich nicht nur durch die Ladereihenfolge, sondern auch durch die Ausführungsreihenfolge erklären . Folgendes passiert:

  1. Mocha lädt die Testdateien und führt sie aus. Alles, was sich auf der obersten Ebene Ihrer Datei befindet, wird sofort ausgeführt . Das bedeutet, dass der Code in test_helper.js wird sofort ausgeführt. Jeder Aufruf zum describe führt sofort seinen Callback aus. Aufrufe jedoch it Zeichnen Sie den Test für die spätere Ausführung auf. Mocha entdeckt Ihre Tests, während Sie dies tun, aber nicht ausführen sie sofort.

  2. Sobald alle Dateien ausgeführt wurden, beginnt Mocha mit der Ausführung der Tests. Zu diesem Zeitpunkt ist der Code in test_helper.js bereits ausgeführt wurde und Ihr Test von der hergestellten Verbindung profitiert.

Wichtige Warnung Das Herstellen einer Verbindung zu einer Datenbank ist ein asynchroner Vorgang, und derzeit gibt es keine Garantie dafür, dass der asynchrone Vorgang in test_helper.js abgeschlossen sein, bevor die Tests beginnen. Dass es jetzt klappt, ist reines Glück.

Wenn ich das wäre, würde ich entweder den Verbindungsaufbau in einen globalen asynchronen before setzen Haken. (Eine globale before Hooks, die in irgendeiner Testdatei erscheinen, werden vor jedem Test ausgeführt, sogar Tests, die in anderen Dateien erscheinen. ) Oder ich würde --delay verwenden und explizit run() aufrufen um die Suite zu starten, nachdem die Verbindung garantiert hergestellt wurde.