Rspecのbeforeまとめ

Rspecのbeforeまとめ

beforeフックを用いた場合の、テストスイートの挙動についてまとめていきます。

before

エイリアス : before(:each) before(:example)

describeまたはcontextブロック内のテスト前、テストスイート全体、それぞれで実行されます。

beforeで定義した変数がテスト前に定義されるタイミングは以下になります。

before do 
  
  @test1 = ...
  
    describe "test describe1" do
    before do
        @test2 = ...
    end
  
    context "test context1" do 
        it do ... end ←実行前に@test1 @test2が定義される
        it do ... end ←実行前に@test1 @test2が定義される
    end
  
    context "test context2" do
        it do ... end ←実行前に@test1 @test2が定義される
        it do ... end ←実行前に@test1 @test2が定義される
    end
    end
  
    describe "test describe2" do
  
    context "test context3" do
        it do ... end ←実行前に@test1が定義される
        it do ... end ←実行前に@test1が定義される
    end
  
    context "test context4" do
        it do ... end ←実行前に@test1が定義される
        it do ... end ←実行前に@test1が定義される
    end
    end
end

before(:all)

エイリアス : before(:context)

describe または context ブロック内の 全テストの前に一回だけ実行されます。

before(:all) do 
  
  @test1 = ...
  
    describe "test describe1" do ←実行前に@test1が定義される
  
    context "test context1" do ←実行前に@test1が定義される
        it do ... end
        it do ... end
    end
  
    context "test context2" do ←実行前に@test1が定義される
        it do ... end
        it do ... end
    end
    end
  
  
    context "test context3" do ←実行前に@test1が定義される
        it do ... end
        it do ... end
    end
  
    context "test context4" do ←実行前に@test1が定義される
        it do ... end
        it do ... end
    end
    end
end

before(:suite)

テストスイート全体の全ファイルを実行する前に実行されます。

before(:suite) doRspec実行時に一度だけ@test1が定義される
  
  @test1 = ...   
 
    describe "test describe1" do
  
    context "test context1" do
        example... 
    end
  
    context "test context2" do
        example...
    end
    end
  
    describe "test describe2" do
  
    context "test context3" do
        example...
    end
  
    context "test context4" do
        example...
    end
    end
end

まとめ

beforeの実行タイミングをまとめました。

EveryDayRailsにも記載がありますが、allとsuiteはテストコード自体が汚くなる可能性もあるので、

基本的には、eachが使用されるものかと思います。