Estoy tratando de mantener mis especificaciones limpias y SECAS, pero tengo algunas pruebas para una API que son idénticas, excepto por la versión de API que se está probando. Podría repetir las especificaciones simplemente usando algo como esto:Repitiendo grupos de ejemplos de RSpec con diferentes argumentos
%w(v1 v2).each do |version|
describe "Query #{version} API" do
it "responds with JSON"
# make the call using the version
end
end
end
pero me gustaría algo un poco más limpia, y por lo que he escrito este método:
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
Y entonces mi prueba podría mirar de la misma familia:
repetitively_describe "Query API", :for => %(v1 v2) do |version|
it "responds with JSON"
# make the call using the version
end
end
comprendo que esto es un poco de pedantería, pero es uno menos nivel de sangría, y si voy a estar haciendo esta llamada, un montón, me gustaría tenerlo limpiador.
Pero, por supuesto, no funciona del todo como me gustaría. La llamada al describe
dentro de mi repetitively_describe
no se registra en la salida de RSpec (cuando se usa el resultado del formato de documentación), aunque los ejemplos dentro de sí se repiten y usan el argumento de bloque de versión como se esperaba. Básicamente, ese nivel de contexto se pierde (se guardan los bloques describe
dentro y fuera del bloque repetitively_describe
).
Hay un código de ejemplo más detallado en a gist en caso de ser necesario. Alguna pista sobre por qué esto no está funcionando del todo bien?
Usaría personalmente un contexto compartido, o un grupo de ejemplo compartido para esto. 'it_behaves_like" una API de consulta "do let (: version) {: v1} end'. https://www.relishapp.com/rspec/rspec-core/docs/example-groups/shared-examples https://www.relishapp.com/rspec/rspec-core/v/2-9/docs/example -groups/shared-context – d11wtq