3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

mochaのhook関数が呼ばれる順番

Posted at

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 国際 ライセンスの下に提供されています。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?