2013-03-30 11 views
36

Ich versuche, das folgende Szenario zu testen:Richtiges Testen von "Assoziationen" mit Rspec?

-> Ich habe ein Modell namens Team, die es nur sinnvoll macht, wenn es von einem Benutzer erstellt wurde. Daher muss jede Team-Instanz mit einem Benutzer verknüpft sein.

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 

Was mich zwingt, als das Team Modell zu ändern:

Um das zu testen, ich habe folgendes getan

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 

Gilt dies auch für Sie richtig scheinen? Ich mache mir nur Sorgen, das Attribut: user als zugänglich zu machen (Massenzuweisung).

Antwort

50

ich in der Regel diesen Ansatz:

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

Eine bessere Lösung wäre, den Edelstein verwenden shoulda die es Ihnen erlaubt, einfach:

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

Was Tests shoulda tatsächlich tut? Ich möchte sicherstellen, dass wenn ein neues Team erstellt wird, es tatsächlich einem Benutzer gehört. –

+0

'Shoulda' wird das testen, es wird" sicherstellen, dass die Beziehung gehört/existiert "(http://rubydoc.info/github/thoughtbot/shoulda-matchers/master/Shoulda/Matchers/ActiveRecord#belong_to-instance_method). Sie können also davon ausgehen, dass Sie beim Erstellen eines neuen Teams zu einem Benutzer gehören. –

+1

Ich habe das gerade getestet und kann ein Team erstellen, ohne einen Benutzer anzugeben. Shoulda scheint nur zu überprüfen, ob es im Modell existiert. Ich möchte sicher sein, dass einem Team ein Benutzer zugeordnet ist ... Ich glaube, ich muss bestätigen, dass es eine Anwesenheit des zugehörigen Benutzers gibt, wenn ich ein Team erstelle ... –

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

Ich bevorzuge diese Lösung gegenüber der darüber. Der sophat-Edelstein brach alle meine pundit-Tests, und obwohl es Umgehungslösungen gibt, würde ich lieber vermeiden, etwas zu verwenden, was wie ein buggy-Juwel aussieht. –

+2

Dies funktioniert mit Rails 5.0.1, rspec 3.5.0 und rspec-rails 3.5.2. – Charlie