Rails / Rspec - написание спецификации для имени класса ассоциации - PullRequest
5 голосов
/ 03 февраля 2012

Учитывая код ниже:

(1) Как бы вы написали спецификацию, чтобы проверить, что имена классов home_team и away_team должны быть классом Team?

(2) Стоит ли вообще писать такую ​​спецификацию? Я не уверен, что вижу в этом смысл, но хотел подумать.

class Event < ActiveRecord::Base

  belongs_to :home_team, :class_name => 'Team', :foreign_key => :home_team_id
  belongs_to :away_team, :class_name => 'Team', :foreign_key => :away_team_id

end

describe Event do

  it { should belong_to(:home_team) }
  it { should belong_to(:away_team) }

end

Было бы неплохо, если бы было что-то вроде:

it { should belong_to(:home_team).with_class_name(:team) }

Ответы [ 2 ]

5 голосов
/ 28 февраля 2012

Вот сообщение в блоге о том, почему это не следует делать:

http://blog.davidchelimsky.net/2012/02/12/validations-are-behavior-associations-are-structure/

Подводя итог, ассоциации - это структура вашего приложения. RSpec предназначен для тестирования поведения. Так что, вероятно, будет лучше, если вы напишите тесты для поведения, полученного из home_team или away_team.

Возьмем, к примеру, если вы хотите имя команды home_team. Было бы лучше, если бы вы написали такой метод:

def home_team_name
  home_team.name
end

Это поведение, которое класс событий запрашивал бы у home_team. Вы можете написать спецификацию, такую ​​как:

describe '#home_team_name' do
  before do
    @home_team = Team.new(:name => 'The Home Team')
    @event = Event.new(home_team_id: @home_team.id)
  end

  it 'should return the name of the home team' do
    @event.home_team_name.should == 'The Home Team'
  end
end 

Это был бы отличный пример тестирования поведения ассоциации, без непосредственного тестирования структуры вашего приложения.

Кроме того, Rails ожидает, что home_team относится к классу «Team», и нет необходимости тестировать каркас, он хорошо протестирован и задокументирован. Единственный способ, которым я мог бы это сделать, - это временно, если бы вам нужно было лучше понять, как работают ассоциации.

4 голосов
/ 28 февраля 2012

Судя по источнику musta-matchers , вы должны быть в состоянии сделать что-то вроде ...

it { should belong_to(:home_team).class_name(:team) }

или

it { should belong_to(:home_team).class_name('Team') }
...