`before()`と `beforeEach()`の違いは何ですか?


90

特に違いは何であるモカさんbefore()とはbeforeEach()?(同じもののための質問after()afterEach()。)

ブロックbefore()ごとに1回実行し、テスト(ブロック)ごとに1回実行すると仮定します。本当?describe()beforeEach()it()

そして、いつ私はどちらか一方を使用することを選択しますか?

回答:


188

before()前に一度実行されるすべてでテストをdescribe
after()   一度に実行された後、すべての中のテストdescribe
beforeEach()の前に実行され、それぞれでテストをdescribe
afterEach()   した後に実行され、各Aでのテストdescribe

どちらを使用するかは、実際のテストによって異なります。

さて、長い説明のために。これで実行する場合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");
    });
});

次のようなものが表示されます(関係のない出力は省略しました):

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

サブレベルでの各テストの前後に実行されるものを見ると驚くかもしれませんが、トップレベルとサブレベルの両方beforeEachコールバックが呼び出されます。についても同じですafterEach

また、一部のシーケンスによって驚いていますsublevel beforetop beforeEachsublevel beforeEach。彼らは順序を期待するように、外側のスコープ内のすべてのフックは、内側のスコープ内のすべてのフックの前に実行すべきだと思います:top beforeEachsublevel beforesublevel beforeEach。ただし、Mochaがフックを実行する順序は完全に理にかなっています。beforeフックはテストのグループのステージを設定するためのものであり、beforeEachテストは個々のテストごとのものです。モカは、テストを実行すると、すべてのbeforebeforeEachで設定されたフックdescribe、それが含まれていること、およびすべての祖先は、describeテストに適用されます。Mochaは、各beforeフックを最も外側のスコープから最も内側に実行し、すべてのbeforeEachフックを最も外側のスコープから最も内側に実行します。しかしながらbefore適用されるすべてのbeforeEachフックは、フックの前に実行されます。これは上記の順序を説明しています:フックであるため、sublevel before前に実行されます。また、とを使用すると、同じロジックが適用されますが、順序が逆になります。適用されるすべてのフックは、フックの前に実行されます。top beforeEachbeforeafterafterEachafterEachafter

また、モカは、トップレベルの通話itと比較して、describe通話の順序を気にしないことに注意してくださいdescribe。それは実行しtop test1top test2そしてその後、サブレベルのテスト、私は与えたためだったにも関わらずtop test1、その後、その後、サブレベルのテストとtop test2

、などの間beforeで何を使用するbeforeEachかは、実際にはテストの詳細によって異なります。モックオブジェクトまたはデータ構造をセットアップする必要があり、このオブジェクトまたは構造1回のテストですべて再利用できるdescribe場合は、を使用beforeしてセットアップおよびafter破棄できます。これは、構造に対して読み取り専用テストを実行している場合に当てはまる可能性があります。すべてのテストがそれを読み取るだけの場合は、何度も作成する必要はありません。あなたの各テストした場合describeのニーズ、新たな構造のコピーは、各テストがされているため、変更する構造をあなたが使用する必要がありますbeforeEach、各テストのために、その後、新たに構造を作成しますafterEachあなたがそれをきれいに壊す必要があるならば。これを行うと、テストの分離が保証されます。各テストは既知の状態から開始され、成功する前のテストの有無に依存しません。


1
よかった。ありがとう。私の質問は、何と理由の一部でした。これは両方、特に読み取り/書き込みの違いを釘付けにします。
ericsoco 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.