特に違いは何であるモカさんbefore()
とはbeforeEach()
?(同じもののための質問after()
とafterEach()
。)
ブロックbefore()
ごとに1回実行し、テスト(ブロック)ごとに1回実行すると仮定します。本当?describe()
beforeEach()
it()
そして、いつ私はどちらか一方を使用することを選択しますか?
回答:
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 before
、top beforeEach
、sublevel beforeEach
。彼らは順序を期待するように、外側のスコープ内のすべてのフックは、内側のスコープ内のすべてのフックの前に実行すべきだと思います:top beforeEach
、sublevel before
、sublevel beforeEach
。ただし、Mochaがフックを実行する順序は完全に理にかなっています。before
フックはテストのグループのステージを設定するためのものであり、beforeEach
テストは個々のテストごとのものです。モカは、テストを実行すると、すべてのbefore
とbeforeEach
で設定されたフックdescribe
、それが含まれていること、およびすべての祖先は、describe
テストに適用されます。Mochaは、各before
フックを最も外側のスコープから最も内側に実行し、すべてのbeforeEach
フックを最も外側のスコープから最も内側に実行します。しかしながら、before
適用されるすべてのbeforeEach
フックは、フックの前に実行されます。これは上記の順序を説明しています:フックであるため、sublevel before
前に実行されます。また、とを使用すると、同じロジックが適用されますが、順序が逆になります。適用されるすべてのフックは、フックの前に実行されます。top beforeEach
before
after
afterEach
afterEach
after
また、モカは、トップレベルの通話it
と比較して、describe
通話の順序を気にしないことに注意してくださいdescribe
。それは実行しtop test1
、top test2
そしてその後、サブレベルのテスト、私は与えたためだったにも関わらずtop test1
、その後、その後、サブレベルのテストとtop test2
。
、などの間before
で何を使用するbeforeEach
かは、実際にはテストの詳細によって異なります。モックオブジェクトまたはデータ構造をセットアップする必要があり、このオブジェクトまたは構造を1回のテストですべて再利用できるdescribe
場合は、を使用before
してセットアップおよびafter
破棄できます。これは、構造に対して読み取り専用テストを実行している場合に当てはまる可能性があります。すべてのテストがそれを読み取るだけの場合は、何度も作成する必要はありません。あなたの各テストした場合describe
のニーズ、新たな構造のコピーは、各テストがされているため、変更する構造をあなたが使用する必要がありますbeforeEach
、各テストのために、その後、新たに構造を作成しますafterEach
あなたがそれをきれいに壊す必要があるならば。これを行うと、テストの分離が保証されます。各テストは既知の状態から開始され、成功する前のテストの有無に依存しません。