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.