运行清理步骤,如果有任何阻塞失败
问题描述:
当我的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
?
答
不知道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
答
我挖了一点到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
当然,如果你想要执行取决于你目前运行的规范不同的回调变得有点复杂。
无论如何,这样您就不必将异常或计数器的测试代码搞乱以检测故障。
作为说明:看起来您需要一些其他规格来依赖此规范创建的工件 - 这是一个很大的不是。你能解释一下上下文,你为什么要这样做?这是非常有趣:) – meta
@meta这是一个非常好的提示,但我的其他规格目前都不依赖于这一个。 我为什么要这样做?在规范中我有一个'之前',带来了Kubernetes集群。然后我用多个“it”块测试集群。如果有任何'它'失败,我想运行取证逻辑来捅机器的日志。 – mxinden
@meta你会以不同的方式模拟这个用例吗? – mxinden