2012-02-03 53 views
4

我有以下AR的has_many,belongs_to的關係:軌道/ Rspec的 - 書寫規範,涉及自定義驗證和belongs_to的關聯

聯賽 - >會議 - >司 - >團隊

我有一個事件模型看起來像這樣:

class Event < ActiveRecord::Base 
    belongs_to :league 
    belongs_to :home_team, :class_name => 'Team', :foreign_key => :home_team_id 
    belongs_to :away_team, :class_name => 'Team', :foreign_key => :away_team_id 

    validate :same_league 

    def same_league 
    return if home_team.blank? || away_team.blank? 
    errors.add :base, "teams must be in the same league" if home_team.league != away_team.league 
    end 
end 

部分廠家:

FactoryGirl.define do 
    factory :league do 
    name 'NFL' 
    end 
end 

Factory.define :conference do |f| 
    f.name 'NFC' 
    f.association :league 
end 

Factory.define :division do |f| 
    f.name 'North' 
    f.association :conference 
end 

Factory.define :team do |f| 
    f.name 'Packers' 
    f.locale 'Green Bay' 
    f.association :division 
end 

FactoryGirl.define do 
    factory :event do 
    association :league 
    association :home_team, :factory => :team 
    association :away_team, :factory => :team 
    end 
end 

所以,所有這一切,我會怎麼去寫一個spec的same_league驗證方法?

我的問題是知道什麼是最簡單的方式去創造不同的聯賽兩隊關聯一個與HOME_TEAM和其他與事件模型AWAY_TEAM。

回答

3

您可以存儲使用工廠生成的實例,然後顯式使用其ID來填充後續工廠的外鍵。

這裏我創建了兩個聯賽,然後設置了兩個測試。其中一項賽事在同一聯賽中有兩支球隊,另一支在不同聯賽中有兩支球隊。這樣我可以測試事件對象是否正確驗證:

describe Event do 
    before(:each) do 
    @first_league = Factory(:league) 
    @second_league = Factory(:league) 
    end 
    it "should allow the home_team and away_team to be from the same league" do 
    home_team = Factory(:team, :league_id => @first_league.id) 
    away_team = Factory(:team, :league_id => @first_league.id) 
    event = Factory(:event, :home_team_id => home_team.id, :away_team_id => away_team.id) 
    event.valid?.should == true 
    end 
    it "should not allow the home_team and away_team to be from two different leagues" do 
    home_team = Factory(:team, :league_id => @first_league.id) 
    away_team = Factory(:team, :league_id => @second_league.id) 
    event = Factory(:event, :home_team_id => home_team.id, :away_team_id => away_team.id) 
    event.valid?.should == false 
    end 
end 
+0

嘿Baldrick - 我的解決方案是否適合您? – 2012-02-14 06:40:27