2013-03-30 6 views
36

Sto provando a verificare il seguente scenario:Modo corretto di testare "associazioni" con Rspec?

-> Ho un modello chiamato Team che ha senso quando è stato creato da un utente. Pertanto, ogni istanza del team deve essere correlata a un utente.

Al fine di verificare che, ho fatto quanto segue:

describe Team do 

... 

    it "should be associated with a user" do 
    no_user_team = Team.new(:user => nil) 
    no_user_team.should_not be_valid 
    end 

... 

end 

Il che mi costringe a cambiare il modello di team come:

class Team < ActiveRecord::Base 
    # Setup accessible (or protected) attributes for your model 
    attr_accessible :name, :user 

    validates_presence_of :name 
    validates_presence_of :user 

    belongs_to :user 
end 

Vi sembra giusto per te? Sono solo preoccupato di rendere l'attributo: user come accessibile (assegnazione di massa).

risposta

50

io di solito uso questo approccio:

describe User do 
    it "should have many teams" do 
    t = User.reflect_on_association(:teams) 
    expect(t.macro).to eq(:has_many) 
    end 
end 

Una soluzione migliore sarebbe quella di utilizzare la gemma shoulda che vi permetterà semplicemente:

describe Team do 
    it { should belong_to(:user) } 
end 
+1

Che cosa significa in realtà shoulda test? Voglio assicurarmi che quando viene creata una nuova squadra, in realtà appartenga a un utente. –

+0

'Shoulda' verificherà che, esso" farà in modo che la relazione belong_to esista "(http://rubydoc.info/github/thoughtbot/shoulda-matchers/master/Shoulda/Matchers/ActiveRecord#belong_to-instance_method). Quindi, puoi tranquillamente presumere che quando creerai un nuovo Team apparterrà ad un utente. –

+1

L'ho appena testato e sono in grado di creare una squadra senza specificare un utente. Shoulda sembra controllare solo se appartiene_esistere nel modello. Voglio essere sicuro che una squadra abbia un utente associato ... Credo che devo convalidare che c'è una presenza dell'Utente associato quando si crea una squadra ... –

25
it { Idea.reflect_on_association(:person).macro.should eq(:belongs_to) } 
    it { Idea.reflect_on_association(:company).macro.should eq(:belongs_to) } 
    it { Idea.reflect_on_association(:votes).macro.should eq(:has_many) } 
+5

preferisco questa soluzione rispetto a quella sopra. la gemma di shoulda ha rotto tutti i miei test di esperti, e mentre ci sono soluzioni alternative, preferisco evitare di usare quella che sembra una gemma bacata. –

+2

Funziona con Rails 5.0.1, rspec 3.5.0 e rspec-rails 3.5.2. – Charlie