2017-08-29 19 views
0

itブロックのいずれかが失敗した場合、でクリーンアップステップを実行します。 itブロックがすべて成功した場合、にクリーンアップステップを実行させたくない場合。ブロックが失敗した場合はクリーンアップステップを実行します。

RSpec.describe 'my describe' do 
    it 'first it' do 
     logic_that_might_fail 
    end 

    it 'second it' do 
     logic_that_might_fail 
    end 

    after(:all) do 
     cleanup_logic if ONE_OF_THE_ITS_FAILED 
    end 
end 

ONE_OF_THE_ITS_FAILEDを実装するにはどうすればよいですか?

+0

注:この仕様で作成された成果物に依存するために、他の仕様が必要なようです。これは大きな問題ではありません。なぜあなたはこれをやろうとしているのですか?非常に面白いです:) – meta

+0

@metaこれは非常に良いヒントですが、私の他の仕様のどれも現在これに依存していません。 なぜ私はこれをしたいですか?私はKubernetesクラスターを引き起こすspecに 'before 'を持っています。次に、複数の 'it'ブロックでクラスタをテストします。 'it'のどれかが失敗した場合、私はマシンのログで犯す法医学的ロジックを実行したい。 – mxinden

+0

@metaこのユースケースを異なる方法でモデル化しますか? – mxinden

答えて

4

ないRSpecのは箱の外に何かを提供していますが、これがうまくいくかどうかわから:

RSpec.describe 'my describe' do 
    before(:all) do 
    @exceptions = [] 
    end 

    after(:each) do |example| 
    @exceptions << example.exception 
    end 

    after(:all) do |a| 
    cleanup_logic if @exceptions.any? 
    end 

    # ... 
end 
0

私はRSpecのコードに少し掘っおよびサルへの道は、RSpecのレポータークラスをパッチました。あなたのspec_helper.rbにこれを入れて:あなたは、現時点ではあなたが実行している仕様に応じて、異なるコールバックを実行したい場合はもちろん

class RSpecHook 
    class << self 
    attr_accessor :hooked 
    end 

    def example_failed(example) 
    # Code goes here 
    end 
end 

module FailureDetection 
    def register_listener(listener, *notifications) 
    super 
    return if ::RSpecHook.hooked 
    @listeners[:example_failed] << ::RSpecHook.new 
    ::RSpecHook.hooked = true 
    end 
end 

RSpec::Core::Reporter.prepend FailureDetection 

それはもう少し複雑になります。

とにかく、この方法では、例外を検出するために例外またはカウンタを使用してテストコードを台無しにする必要はありません。

関連する問題