Techioz Blog

RSpec はフックの前、後、周囲でどのような順序で実行されますか?

概要

いくつかの問題に直面したので、フックが実行される前後の順序を確認することにしました。これが私がやったことです:

require "spec_helper"

describe "The order:" do

  before(:all) {
    puts "before_all"
  }

  after(:all) {
    puts "after_all"
  }

  before(:each) {
    puts "before_each"
  }

  after(:each) {
    puts "after_each"
  }

  describe "DESC A" do
    before {
      puts "A_before"
    }
    it "A_it_1" do      
      expect(1).to eq(1)
    end
    it "A_it_2" do
      expect(1).to eq(1)
    end
  end

  describe "DESC B" do
    before {
      puts "B_before"
    }
    it "B_it_1" do      
      expect(1).to eq(1)
    end
    it "B_it_2" do
      expect(1).to eq(1)
    end
  end  
end

そして私が得たもの:

The order:

before_all

  DESC A
before_each
A_before
after_each
    A_it_1
before_each
A_before
after_each
    A_it_2
  DESC B
before_each
B_before
after_each
    B_it_1
before_each
B_before
after_each
    B_it_2

after_all

ここで何が起こっているのですか? after_each が A_it_1 より前に実行されるのはなぜですか?

アップデート:

around(:each) を追加するとさらに楽しいです。

 around(:each) do |example|
    puts "around_in"
    example.run
    puts "around_out"
  end

そして結果:

The order:
before_all
  DESC A
around_in
before_each
A_before
after_each
around_out
    A_it_1
around_in
before_each
A_before
after_each
around_out
    A_it_2
  DESC B
around_in
before_each
B_before
after_each
around_out
    B_it_1
around_in
before_each
B_before
after_each
around_out
    B_it_2
after_all

解決策

あなたの出力、および relishapp.com に文書化されている公式出力は正しいです。何が起こっているかというと、after(:each) で例外が発生するとサンプルが失敗するため、rspec は各サンプルの後に after(:each) を実行する必要があります。 rspec は出力に例を表示する前に、それが緑か赤かを知る必要があります。つまり、例の説明が出力に表示される前に after(:eaches) を実行する必要があります。

ただし、実際の例に Puts ステートメントを挿入すると、その前に before(:each)es が発生し、次にサンプル コードが (puts を含む) 実行され、次に after(:each)es が実行されることがわかります。ご想像のとおり、最後に例の説明が画面に出力されます。

あなたと同じように、私も混乱していましたが、サンプルのラベルを出力する rspec が実際に行っていることと一致しないことに気づきました。ラベルは、すべての before(:all) と before(:each) の 1 回だけ出力されます。この例では、es および after(:each)es が実行されます。

注: after(:all) は、サンプルのラベルが出力された後に実行されます。これは、テストの結果に影響を与えないためです (after(:all) フックで例外が発生したという警告が生成されますが、これは影響しません)テストを赤にします)。