Colocar blocos de descrição RSpec em outros blocos para manter SECO

Suponha que você tenha um controlador que responde à mesma ação em dois verbos HTTP diferentes. Algo como o seguinte é um bom exemplo:

class BlogPostsController < ApplicationController
def update
render nothing
: true
end
end

com as entradas correspondentes em routes.rb

resource :blog_posts do
member
do
post
'update'
put
'update'
end
end

Normalmente, você pode testar ambas as ações usando dois testes separados:

describe BlogPostsController do

describe
"POST update" do
subject
{ post :update }
it
{ should be_success }
end

describe
"PUT update" do
subject
{ put :update }
it
{ should be_success }
end

end

… mas você também pode abstrair os verbos HTTP em uma matriz e testar a descrição em um bloco produzindo o verbo:

describe BlogPostsController do

%w{post put}.each do |method|
describe
"update" do
subject
{ send(method, :update) }
it
{ should be_success }
end
end

end

Também é possível usar parâmetros diferentes que se aplicam a todos os testes em um bloco de descrição. Por exemplo, se tivéssemos duas funções em que ambas precisassem de permissões para executar as mesmas ações em uma rota, também poderíamos passá-las usando o mesmo processo. Não sei por que, mas nunca pensei em colocar descrições dentro de blocos antes. É claro que existem possibilidades interessantes.