我试图保持我的规范干净和干燥,但是我对一个 API 进行了一些测试,除了正在测试哪个版本的 API 之外,它们是相同的。我可以简单地使用这样的东西重复规格:
%w( v1 v2 ).each do |version|
describe "Query #{version} API" do
it "responds with JSON"
# make the call using the version
end
end
end
但我想要一些更清洁的东西,所以我写了这个方法:
module RepetitivelyDescribe
def repetitively_describe(*args, &example_group_block)
options = args.extract_options!
options.delete(:for).each do |item|
item_args = args.collect(&:dup) + [options.dup]
item_args[0] << " [#{item}]"
describe(*item_args) do
example_group_block.call item
end
end
end
end
RSpec::Core::ExampleGroup.extend RepetitivelyDescribe
然后我的测试可能看起来更像这样:
repetitively_describe "Query API", :for => %( v1 v2 ) do |version|
it "responds with JSON"
# make the call using the version
end
end
我意识到这有点迂腐,但它的缩进层次少了一层,如果我要经常打这个电话,我想让它更干净。
但是,当然,它并没有像我想要的那样工作。describe
my中的调用repetitively_describe
不会记录到 RSpec 输出(使用文档格式输出时),尽管其中的示例确实会重复并按预期使用版本块参数。本质上,该级别的上下文会丢失(保留describe
块外部和内部的repetitively_describe
块)。
如果需要,gist中有更详细的示例代码。关于为什么这不能正常工作的任何线索?