轨道/ Rspec的 - 书写规范,涉及自定义验证和belongs_to的关联
问题描述:
我有以下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。
答
您可以存储使用工厂生成的实例,然后显式使用其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
嘿Baldrick - 我的解决方案是否适合您? – 2012-02-14 06:40:27