2017-08-29 45 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集群。然后我用多个“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 

当然,如果你想要执行取决于你目前运行的规范不同的回调变得有点复杂。

无论如何,这样您就不必将异常或计数器的测试代码搞乱以检测故障。

相关问题