Was ist der Unterschied zwischen "before ()" und "beforeEach ()"?

87

Was speziell ist der Unterschied zwischen Mocha ‚s before()und beforeEach()? (Gleiche Frage für after()und afterEach().)

Ich gehe davon aus, dass es before()einmal pro describe()Block und beforeEach()einmal pro Test ( it()Block) ausgeführt wird. Ist das wahr?

Und wann würde ich mich dafür entscheiden, eins über das andere zu verwenden?

ericsoco
quelle

Antworten:

182

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 beforeEachRü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 beforeHook soll die Bühne für eine Gruppe von Tests bilden, während ein beforeEachTest für jeden einzelnen Test gilt. Wenn Mocha einen Test ausführt, gelten alle beforeund alle beforeEachHooks, die in dem Test festgelegt wurden describe, und alle Vorfahren davon describefür den Test. Mocha führt jeden beforeHaken vom äußersten bis zum innersten Bereich und alle beforeEachHaken vom äußersten bis zum innersten Bereich aus. jedochAlle beforezutreffenden Hooks werden vor jedem beforeEachHook ausgeführt. Dies erklärt die obige Reihenfolge: sublevel beforeWird zuvor ausgeführt, top beforeEachda es sich um einen beforeHook handelt. Und mit afterund afterEachgilt dieselbe Logik, aber die Reihenfolge ist umgekehrt: Alle afterEachzutreffenden Hooks werden vor jedem afterHook ausgeführt.

Beachten Sie auch, dass es Mocha egal ist, wie ich meine itAnrufe im Verhältnis zum describeAnruf in der obersten Ebene bestellt habe describe. Sie führt top test1, top test2und 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, beforeEachetc. 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 describeSie beforees einrichten und afterabreiß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 describeeine Bedarf neue Kopie der Struktur , da jeder Test wird modifiziert die Struktur dann sollten Sie beforeEachdie Struktur neu für jeden Test erstellen und dannafterEachwenn 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.

Louis
quelle
1
Grosses Dankeschön. Meine Frage war teils was und teils warum, dies nagelt beides, insbesondere die Unterscheidung zwischen Lesen / Schreiben.
Ericsoco