1. ホーム
  2. javascript

[解決済み] before()` と `beforeEach()` の違いは何ですか?

2022-03-11 19:05:46

質問

とは具体的にどのような違いがあるのでしょうか。 モカ 's before()beforeEach() ? (同じ質問で after()afterEach() .)

と仮定します。 before() につき1回実行されます。 describe() ブロックと beforeEach() は1回のテストにつき1回実行されます ( it() ブロック)を作成します。それは本当ですか?

また、どのような場合にどちらを使うか選択するのでしょうか?

どのように解決するのですか?

before() が一度実行される前に すべて のテストは describe
after()   の後に一度だけ実行されます。 すべて のテストは describe
beforeEach() が実行される前に のテストは describe
afterEach()   の後に実行されます。 のテストを 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 before , top beforeEach , sublevel beforeEach . 彼らは、外側のスコープにあるすべてのフックは内側のスコープにあるすべてのフックより先に実行されるべきだと考えているので、そのような順序を期待しているのです。 top beforeEach , sublevel before , sublevel beforeEach . しかし、Mocha がフックを実行する順序は完全に理にかなっています。 before フックは一連のテストの舞台を用意するためのものであり、一方 beforeEach テストは個々のテストのためのものです。Mocha がテストを実行するとき、すべての beforebeforeEach で設定したフックを describe を含むすべての先祖と、それを含む describe がテストに適用されます。Mocha はそれぞれの before フックは一番外側のスコープから一番奥のスコープまで、そしてすべての beforeEach は一番外側のスコープから一番内側のスコープにフックします。 しかし は、すべての before フックが適用され、そのフックは beforeEach フックです。これは上記の順序を説明しています。 sublevel before が実行される前に top beforeEach であるため before フックを使用します。そして afterafterEach の場合、同じロジックが適用されますが、順序は逆になります:すべての afterEach フックが実行される前に、適用される after フックです。

また、Mocha は私がどのように it との相対的な呼び出しです。 describe の呼び出しは、トップレベルの describe . これは top test1 , top test2 では であったにもかかわらず、サブレベルテストでは top test1 で、次にサブレベルテスト、そして top test2 .

の中で使いたいもの before , beforeEach などは、テストの内容によって異なります。もしモックオブジェクトやデータ構造を設定する必要があり、 そのオブジェクトや構造体が できる のすべてのテストで再利用され、1つの describe を使用することができます。 before で設定し after を使用すると、それを取り壊すことができます。これは、構造体に対して読み取り専用のテストを行っている場合に起こりうることです。すべてのテストがそれを読むだけなら、何度も作成する必要はありません。もしあなたの describe が必要です。 新しい というのは、各テストは 修正 を使用する必要があります。 beforeEach を使用して、テストごとに新たに構造を作成し、その後 afterEach は、きれいに解体する必要がある場合です。こうすることで、テストの分離を確実にします。各テストは既知の状態から始まり、成功するために以前のテストの有無に依存しません。