Como escrever melhor um lactador personalizado do RSPEC para testar o controle de acesso em um aplicativo Rails
-
10-07-2019 - |
Pergunta
OK, então, em vez de escrever um monte de especificações de controle de acesso e duplicar -as em muitos dos meus arquivos de especificações, estou procurando criar um correspondente personalizado. Então, em vez disso:
describe "access control" do
it "should prevent access by non-logged-in users"
it "should prevent access by normal users"
it "should prevent access by editor users"
it "should prevent access by admin users"
it "should allow access by super admin users"
end
Eu quero fazer algo assim:
lambda do
get :index
end.should have_access_control(:allowed => [:super_admin], :disallowed => [:admin, :editor, :user])
Existem exemplos ou sugestões de como posso fazer algo assim?
Solução
OK, Eu encontrei um método de conseguir isso, embora ele não use um correspondente personalizado. Inclua o código a seguir em seu spec_helper.rb:
def access_control (code, options={})
options = {:allow => [], :disallow => []}.merge(options)
options[:allow].each do |user|
it "#{code} should allow #{user.to_s}" do
login_as(user)
eval code
response.should_not redirect_to(login_path)
end
end
options[:disallow].each do |user|
it "#{code} should disallow #{user.to_s}" do
login_as(user)
eval code
response.should redirect_to(login_path)
end
end
end
E chame o seguinte:
access_control("get :index", {:allow => [:super_admin], :disallow => [:quentin, :admin]})
Você pode usá -lo para criar uma lista completa de métodos que devem ser restritos e os usuários aos quais estão restritos.
Outras dicas
Eu discordo da sua solução. Os testes não devem ser uma área para considerar a duplicação como essa. Torna os testes mais difíceis de ler e mais difíceis de manter. Além disso, certamente há um argumento a ser feito que A duplicação nos testes pode informar seu design.
No exemplo inicial que você listou, existem 5 contextos diferentes que devem ser testados isoladamente e capazes de ser entendidos rapidamente. Sua solução, enquanto arrumada, prejudica esses dois objetivos.