mochaで、describeをネストして書くことが多いんですが、その時にhook関数がどういう順番で呼ばれるのか不安に駆られたので調べてみました。
テストコードはこんな感じです。行数削減のために詰めて書いているのでちょっと見難いですが、ご容赦ください。
const {expect} = require("chai");
before(function(){console.log("global before")});
beforeEach(function(){console.log("global beforeEach")});
after(function(){console.log("global after")});
afterEach(function(){console.log("global afterEach")});
describe("hook call order test", function(){
before(function(){console.log("before 1")});
beforeEach(function(){console.log("beforeEach 1")});
afterEach(function(){console.log("afterEach 1")});
after(function(){console.log("after 1")});
describe("inner describe", function(){
before(function(){console.log("before 2")});
beforeEach(function(){console.log("beforeEach 2")});
afterEach(function(){console.log("afterEach 2")});
after(function(){console.log("after 2")});
it("test case 1", function(){
expect(true).to.be.true;
});
it("test case 2", function(){
expect(true).to.be.true;
});
});
describe("inner describe 2", function(){
before(function(){console.log("before 3")});
beforeEach(function(){console.log("beforeEach 3")});
afterEach(function(){console.log("afterEach 3")});
after(function(){console.log("after 3")});
it("test case 1 in describe 2", function(){
expect(true).to.be.true;
});
it("test case 2 in describe 2", function(){
expect(true).to.be.true;
});
});
});
これを実行すると次のようになります。
global before
hook call order test
before 1
inner describe
before 2
global beforeEach
beforeEach 1
beforeEach 2
✓ test case 1
afterEach 2
afterEach 1
global afterEach
global beforeEach
beforeEach 1
beforeEach 2
✓ test case 2
afterEach 2
afterEach 1
global afterEach
after 2
inner describe 2
before 3
global beforeEach
beforeEach 1
beforeEach 3
✓ test case 1 in describe 2
afterEach 3
afterEach 1
global afterEach
global beforeEach
beforeEach 1
beforeEach 3
✓ test case 2 in describe 2
afterEach 3
afterEach 1
global afterEach
after 3
after 1
global after
4 passing (14ms)
呼ばれる順番は、before/beforeEachはネストの外側から順番、after/afterEachはネストの内側から順番ですね。
内側のdescribe関数に書いたbefore関数は、そのdescribe関数の中にあるテストケース(it関数)が呼ばれる前に呼ばれて、after関数は、そのdescribe関数の中にあるテストケースと、afterEach関数が呼ばれた後に呼ばれるようです。
before/afterという名前に釣られて、テスト開始時にbefore関数が全部呼ばれて、after関数は終了直前まで呼ばれないような気がしていたんですが、hookを定義したdescribe関数の内側のテストケースを開始する直前と直後で呼ばれるんですね。
この記事は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。