Come scrivere al meglio un matcher personalizzato RSpec per testare il controllo degli accessi in un'app Rails

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

  •  10-07-2019
  •  | 
  •  

Domanda

OK, quindi invece di scrivere un sacco di specifiche di controllo di accesso e duplicarle su molti dei miei file di specifiche, sto cercando di creare un matcher personalizzato. Quindi invece di questo:

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

Voglio fare qualcosa del genere:

lambda do
  get :index
end.should have_access_control(:allowed => [:super_admin], :disallowed => [:admin, :editor, :user])

Ci sono esempi o suggerimenti su come posso fare qualcosa del genere?

È stato utile?

Soluzione

OK, Ho trovato un metodo per raggiungere questo obiettivo , sebbene non utilizzi un abbinamento personalizzato. Includi il seguente codice nel tuo 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 chiamalo come segue:

access_control("get :index", {:allow => [:super_admin], :disallow => [:quentin, :admin]})

È quindi possibile utilizzarlo per creare un elenco completo di metodi che dovrebbero essere limitati e gli utenti a cui sono limitati.

Altri suggerimenti

Non sono d'accordo con la tua soluzione. I test non dovrebbero essere un'area per fattorizzare la duplicazione in questo modo. Rende i test più difficili da leggere e più difficili da mantenere. Inoltre, c'è sicuramente un argomento da sostenere che la duplicazione nei test può informare il tuo design .

Nell'esempio iniziale che hai elencato, ci sono 5 diversi contesti che dovrebbero essere testati separatamente e in grado di essere capiti a colpo d'occhio. La tua soluzione, benché ordinata, danneggia questi due obiettivi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top