Я пытаюсь сохранить свои спецификации чистыми и СУХИМИ, но у меня есть несколько тестов для 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
I понимаю, что это немного педантизма, но это на один уровень отступа меньше, и если я собираюсь делать этот вызов много, я бы хотел, чтобы он был чище.
Но, конечно, это работает не совсем так, как мне бы хотелось. Вызов description
в моем repetitively_describe
не регистрируется в выводе RSpec (при использовании вывода в формате документации), хотя примеры внутри повторяются и используют аргумент блока версии как и ожидалось. По сути, этот уровень контекста теряется (блоки description
снаружи и внутри блока repetitively_describe
сохраняются).
Более подробный пример кода приведен в суть, если он понадобится. Есть какие-нибудь подсказки, почему это не совсем правильно работает?