2013-03-30 15 views
36

私は以下のシナリオを試してみようとしています:Rspecとの "関連付け"テストの正しい方法は?

- >私はTeamというモデルを持っています。これはユーザーが作成したときに意味があります。したがって、各チームインスタンスは、ユーザーに関連している必要があります。それをテストするために、私は次のことを行っている

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 

としてチームモデルを変更するために私を強制的に:

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 

これはあなたに正しいように見えるのか?私はthe:user属性をアクセス可能にすることを心配しています(質量割り当て)。

答えて

50

私は通常、このアプローチを使用します。

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

より良い解決策は単純にあなたをできるようになります宝石shouldaを使用することです:

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

shoulda、実際にテストを行いますか?私は、新しいチームが実際にユーザーに属していることを確認したいと思います。 –

+0

'Shoulda'はそれをテストします、それは" belongs_to関係が存在することを保証します "(http://rubydoc.info/github/thoughtbot/shoulda-matchers/master/Shoulda/Matchers/ActiveRecord#belong_to-instance_method)。したがって、新しいチームを作成するときには、ユーザーに属していると見なすことができます。 –

+1

私はそれをテストしただけで、ユーザーを指定せずにチームを作成することができます。モデルにbelongs_toが存在するかどうかをチェックするだけのようです。私はチームにそれに関連付けられたユーザーがいることを確認したいと思います...私は、チームを作成するときに関連付けられたユーザーが存在することを検証する必要があると考えています... –

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

私はこのソリューションをその上のものよりも好む。私の鑑賞テストはすべて壊れてしまいましたが、回避策はありますが、バギーのような宝石のようなものは避けたいです。 –

+2

これは、Rails 5.0.1、rspec 3.5.0、およびrspec-rails 3.5.2で動作します。 – Charlie

関連する問題