2012-02-03 40 views
5

考虑下面的代码的类名:轨道/ Rspec的 - 写作规范为belongs_to的关联

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

回答

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”,并且不需要测试框架,它已经过很好的测试和记录。如果你需要提高你对协作工作方式的理解,我能看到做到这一点的唯一方法是暂时的。

+0

Heads Up:除非我做了'@home_team = Team.create(...'而不是'.new('因为它看起来像AR直到它被保存时才会给出一个id。 – afxjzs 2013-11-12 16:00:25

3

shoulda-matchers source来看,你应该能够做到像...

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

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