Повторение групп примеров RSpec с разными аргументами

Я пытаюсь сохранить свои спецификации чистыми и СУХИМИ, но у меня есть несколько тестов для 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сохраняются).

Более подробный пример кода приведен в суть, если он понадобится. Есть какие-нибудь подсказки, почему это не совсем правильно работает?

5
задан pat 2 June 2012 в 09:48
поделиться