sql >> Database >  >> NoSQL >> MongoDB

Hoe Mocha weet welk bestand het eerst moet worden geladen in de testsuite

Er is geen standaard ingestelde volgorde voor hoe Mocha de testbestanden laadt.

Wanneer Mocha een map scant om bestanden te vinden, gebruikt het fs.readdirSync . Deze oproep is een wrapper rond readdir(3) , die zelf geen bestelling garandeert. Nu, vanwege een implementatie-gril de uitvoer van fs.readdir en fs.readdirSync is gesorteerd op Linux (en waarschijnlijk POSIX-systemen in het algemeen) maar niet op Windows . Bovendien is het mogelijk dat het gesorteerde gedrag op Linux uiteindelijk kan worden verwijderd omdat de documentatie fs.readdir zegt is gewoon readdir(3) en de laatste garandeert geen orde. Er is een goed argument dat het waargenomen gedrag op Linux een bug is (zie het probleem waarnaar ik hierboven heb gelinkt).

Merk op dat er een --sort . is optie die bestanden sorteert nadat Mocha ze heeft gevonden. Maar dit is standaard uitgeschakeld.

Het gedrag dat u waarneemt, kan niet alleen worden verklaard door de laadopdracht, maar ook door de uitvoeringsopdracht . Dit is wat er gebeurt:

  1. Mocha laadt de testbestanden en voert ze uit. Dus alles wat zich op het hoogste niveau van uw bestand bevindt, wordt onmiddellijk uitgevoerd . Dit betekent dat de code in test_helper.js voert meteen uit. Elke oproep om describe voert onmiddellijk zijn callback uit. Aanroepen naar it neem de test op voor latere uitvoering. Mokka is ontdekt uw tests terwijl u dit doet, maar niet uitvoert ze meteen.

  2. Zodra alle bestanden zijn uitgevoerd, begint Mocha de tests uit te voeren. Tegen die tijd is de code in test_helper.js is al uitgevoerd en uw test profiteert van de verbinding die het heeft gemaakt.

Belangrijke waarschuwing Verbinding maken met een database is een asynchrone bewerking en momenteel is er niets dat garandeert dat de asynchrone bewerking in test_helper.js voltooid zijn voordat de tests beginnen. Dat het nu goed werkt, is gewoon geluk.

Als ik dit was, zou ik de verbinding tot stand brengen in een globale asynchrone before haak. (Een algemeen before hook die in een testbestand verschijnt, wordt uitgevoerd vóór welke test dan ook, zelfs tests die in andere bestanden voorkomen. ) Of ik zou gebruiken --delay en expliciet run() . aanroepen om de suite te starten nadat de verbinding gegarandeerd is.



  1. Maak een Multikey Index in MongoDB

  2. Java&Mongo:object ophalen waar veld bestaat

  3. Speel 2.0 FakeApplication-configuratie met testconfiguratie

  4. $elemMatch-projectie in node.js