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) フックで例外が発生したという警告が生成されますが、これは影響しません)テストを赤にします)。