2013-03-30 25 views
36

Próbuję przetestować następujący scenariusz:Prawidłowy sposób testowania "asocjacji" z Rspec?

-> Mam model o nazwie Team, który ma sens tylko wtedy, gdy został utworzony przez użytkownika. Dlatego każda instancja Team musi być powiązana z użytkownikiem.

W celu sprawdzenia, że ​​zrobiłem, co następuje:

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 

co zmusza mnie do zmiany modelu zespołu jako:

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 

Czy to wydaje się poprawne dla ciebie? Martwię się tylko o to, aby atrybut: user był dostępny (przypisanie masy).

Odpowiedz

50

Zwykle używam tego podejścia:

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

Lepszym rozwiązaniem byłoby użyć gem shoulda który pozwoli Ci po prostu:

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

Co powinienem faktycznie testy? Chcę się upewnić, że po utworzeniu nowego zespołu faktycznie należy on do użytkownika. –

+0

'Shoulda' sprawdzi to," upewni się, że istnieje związek belongs_to "(http://rubydoc.info/github/thoughtbot/shoulda-matchers/master/Shoulda/Matchers/ActiveRecord#belong_to-instance_method). W ten sposób można bezpiecznie założyć, że przy tworzeniu nowego zespołu będzie należał do użytkownika. –

+1

Właśnie to przetestowałem i jestem w stanie stworzyć zespół bez określania użytkownika. Shoulda wydaje się po prostu sprawdzać, czy belongs_to istnieje w modelu. Chcę mieć pewność, że zespół ma powiązanego użytkownika ... Uważam, że muszę potwierdzić obecność powiązanego użytkownika podczas tworzenia zespołu ... –

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

Preferuję to rozwiązanie powyżej tego nad nim. Klejnot z mai zniszczył wszystkie moje sprawdzone testy, a mimo że istnieją obejścia, wolałbym raczej unikać używania czegoś, co wydaje się być paskudnym klejnotem. –

+2

Działa z Railsami 5.0.1, rspec 3.5.0 i rspec-rails 3.5.2. – Charlie

Powiązane problemy