2017-10-30 17 views
-1

特定のコンテキストの前に特定のコードブロックを実行する必要があります。コンテキストブロックにメタデータを使用しようとしましたが、すべての例の前にコードのブロックを呼び出します。特定のコンテキストの前に特定のコードを1回だけ実行する

before do |context| 
    p 'test test' if context.medata[:something] 
end 
... 
describe '#execute' do 
    context 'header with timelog fields', :something do 
    it '123' do 
     expect(true).to eq true 
    end 
    it '234' do 
     expect(true).to eq true 
    end 
    end 
end 

test test rspecを実行すると2回表示されます。

+0

あなたがそのようないくつかのコンテキストを持つことができますか?はいの場合、ブロックを何回実行しますか? –

+0

あなたの質問は何ですか? – sawa

+0

メダータとは何ですか? – sawa

答えて

1

rspecの場合、beforebefore(:each)の略です。あなたが使用する必要がどのような

は、代わりに、before(:all)です:

describe '#execute' do 
    context 'header with timelog fields' do 
    before(:all) do 
     p 'test test' 
    end 

    it '123' do 
     expect(true).to eq true 
    end 
    it '234' do 
     expect(true).to eq true 
    end 
    end 
end 
+1

**しかし**、このようなコードを書くときは注意が必要です!テストでシステムの「グローバルな状態」を変更することは通常は*悪いとみなされます。 「システムを正確に見つけたままにしておく」必要があります。そうでないと、ランダムな順序で実行されているテストによって断続的にテストが失敗することがあります。 –

+1

しかし、このパターンにはいくつかの正当なユースケースがあります。 'before(:all)'が実際に何をしているかによって、 'after(:all)'を定義して、システムを通常の状態に「リセット」することも考えてください。 –

関連する問題