Rails / Rspec - 为belongs_to关联的类名编写规范

时间:2012-02-03 03:16:11

标签: associations rspec-rails

鉴于以下代码:

(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) }

3 个答案:

答案 0 :(得分:5)

这是一篇关于为什么不应该这样做的博客文章:

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'类,并且不需要测试框架,它经过了充分的测试和记录。如果您需要提高对关联工作方式的理解,那么我可以看到这样做的唯一方法是暂时的。

答案 1 :(得分:4)

根据shoulda-matchers source判断,您应该可以做类似的事情......

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

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

答案 2 :(得分:0)

您可以在belongs_to中以optional true引用此答案 协会 https://stackoverflow.com/a/60630840/9490901