before()
wird einmal ausgeführt, bevor alle Tests in a describe
after()
einmal ausgeführt werden, nachdem alle Tests in a describe
beforeEach()
ausgeführt wurden, bevor jeder Test in a describe
afterEach()
nach jedem Test in a ausgeführt wirddescribe
Welches Sie verwenden möchten, hängt von Ihrem tatsächlichen Test ab.
Nun zur langen Erklärung. Wenn Sie darauf laufen mocha -R min
:
describe("top", function () {
before(function () {
console.log("top before");
});
after(function () {
console.log("top after");
});
beforeEach(function () {
console.log("top beforeEach");
});
afterEach(function () {
console.log("top afterEach");
});
it("test1", function () {
console.log("top test1");
});
describe("sublevel", function() {
before(function () {
console.log("sublevel before");
});
after(function () {
console.log("sublevel after");
});
beforeEach(function () {
console.log("sublevel beforeEach");
});
afterEach(function () {
console.log("sublevel afterEach");
});
it("test1", function () {
console.log("sublevel test1");
});
it("test2", function () {
console.log("sublevel test2");
});
});
it("test2", function () {
console.log("top test2");
});
});
Sie sehen so etwas wie (ich habe die Ausgabe weggelassen, die nicht relevant ist):
top before
top beforeEach
top test1
top afterEach
top beforeEach
top test2
top afterEach
sublevel before
top beforeEach
sublevel beforeEach
sublevel test1
sublevel afterEach
top afterEach
top beforeEach
sublevel beforeEach
sublevel test2
sublevel afterEach
top afterEach
sublevel after
top after
Die Sache, die überraschend sein kann, wenn Sie sich ansehen, was vor und nach jedem der Tests auf der Unterebene ausgeführt wird, ist, dass sowohl die beforeEach
Rückrufe auf der obersten Ebene als auch auf der Unterebene aufgerufen werden. Gleiches gilt für die afterEach
.
Einige sind auch durch die Folge überrascht sublevel before
, top beforeEach
, sublevel beforeEach
. Sie denken , dass alle Haken in einem äußeren Umfang vor allen den Haken in einem inneren Umfang ausgeführt werden sollen, so dass sie die Folge erwarten: top beforeEach
, sublevel before
, sublevel beforeEach
. Die Reihenfolge, in der Mocha die Hooks ausführt, ist jedoch völlig sinnvoll: Ein before
Hook soll die Bühne für eine Gruppe von Tests bilden, während ein beforeEach
Test für jeden einzelnen Test gilt. Wenn Mocha einen Test ausführt, gelten alle before
und alle beforeEach
Hooks, die in dem Test festgelegt wurden describe
, und alle Vorfahren davon describe
für den Test. Mocha führt jeden before
Haken vom äußersten bis zum innersten Bereich und alle beforeEach
Haken vom äußersten bis zum innersten Bereich aus. jedochAlle before
zutreffenden Hooks werden vor jedem beforeEach
Hook ausgeführt. Dies erklärt die obige Reihenfolge: sublevel before
Wird zuvor ausgeführt, top beforeEach
da es sich um einen before
Hook handelt. Und mit after
und afterEach
gilt dieselbe Logik, aber die Reihenfolge ist umgekehrt: Alle afterEach
zutreffenden Hooks werden vor jedem after
Hook ausgeführt.
Beachten Sie auch, dass es Mocha egal ist, wie ich meine it
Anrufe im Verhältnis zum describe
Anruf in der obersten Ebene bestellt habe describe
. Sie führt top test1
, top test2
und dann die sublevel Tests, auch wenn der Auftrag gab ich war top test1
, dann sind die sublevel Tests und dann top test2
.
Was Sie wollen , unter verwenden before
, beforeEach
etc. hängt wirklich von den Besonderheiten Ihres Tests. Wenn Sie ein Scheinobjekt oder eine Datenstruktur einrichten müssen und dieses Objekt oder diese Struktur von allen Tests in einem einzigen wiederverwendet werden kann , können describe
Sie before
es einrichten und after
abreißen. Dies kann der Fall sein, wenn Sie schreibgeschützte Tests für die Struktur durchführen. Wenn alle Ihre Tests es nur lesen, müssen Sie es nicht immer wieder erstellen. Wenn jeder Test in Ihrem describe
eine Bedarf neue Kopie der Struktur , da jeder Test wird modifiziert die Struktur dann sollten Sie beforeEach
die Struktur neu für jeden Test erstellen und dannafterEach
wenn Sie es sauber abreißen müssen. Auf diese Weise wird die Testisolation sichergestellt: Jeder Test beginnt in einem bekannten Zustand und hängt nicht vom Vorhandensein oder Fehlen eines vorherigen Tests ab, um erfolgreich zu sein.