Rails / Rspec - написание спецификации, включающей пользовательскую проверку и ассоциации - PullRequest
4 голосов
/ 03 февраля 2012

У меня есть следующие отношения AR has_many, own_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 в модели событий.

1 Ответ

3 голосов
/ 10 февраля 2012

Вы можете хранить экземпляры, созданные вами на фабриках, а затем явно использовать их идентификаторы для заполнения внешних ключей для последующих фабриок.

Здесь я создаю две лиги, а затем настраиваю два теста. Одна, где на соревнованиях участвуют две команды в одной лиге, а другая - с двумя командами в разных лигах. Таким образом, я могу проверить, правильно ли проверяется объект события:

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
...