Como escrever melhor um lactador personalizado do RSPEC para testar o controle de acesso em um aplicativo Rails

StackOverflow https://stackoverflow.com/questions/197864

  •  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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top