私は自分の仕様をクリーンで DRY に保とうとしていますが、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
これは少し衒学的なことだと思いますが、インデントのレベルが 1 つ少ないので、この呼び出しを頻繁に行う場合は、より簡潔にしたいと思います。
しかし、もちろん、それは私が望むようには機能していません。describe
my 内の呼び出しrepetitively_describe
は RSpec 出力に記録されません (ドキュメンテーション形式の出力を使用する場合)。基本的に、そのレベルのコンテキストは失われます (describe
ブロックの外側と内側のrepetitively_describe
ブロックは保持されます)。
必要に応じて、より詳細なサンプルコードが要点にあります。これがうまくいかない理由の手がかりはありますか?