【问题标题】:Rails / Rspec - writing spec involving custom validation and belongs_to associationsRails / Rspec - 编写涉及自定义验证和 belongs_to 关联的规范
【发布时间】:2012-02-03 03:36:35
【问题描述】:

我有以下 AR has_many,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

那么,我将如何为 same_league 验证方法编写规范?

describe Event do
  pending 'should not allow home_team and away_team to be from two different leagues'
end

我的问题是知道在赛事模型中创建两支不同联赛的球队并将一支与 home_team 和另一支与 away_team 相关联的最简单方法。

【问题讨论】:

    标签: ruby-on-rails factory-bot rspec-rails


    【解决方案1】:

    您可以存储使用工厂生成的实例,然后显式使用它们的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-02
      • 2012-12-25
      • 2014-08-24
      相关资源
      最近更新 更多