2012-02-03 20 views
5

Với mã bên dưới:Rails/RSpec - viết spec cho tên lớp của belongs_to hiệp hội

(1) Làm thế nào bạn sẽ viết một spec để kiểm tra rằng tên lớp của HOME_TEAM và đấu với AWAY_TEAM nên một lớp đội?

(2) Bạn có nên bận tâm viết một thông số như vậy không? Tôi không chắc chắn tôi thấy giá trị khi làm như vậy, nhưng muốn có được suy nghĩ của bạn.

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 

Sẽ được tốt đẹp nếu shoulda có cái gì đó như:

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

Trả lời

5

Đây là một bài viết trên blog về việc tại sao điều này thực sự không nên được thực hiện:

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

Để tóm tắt, các hiệp hội là cấu trúc của ứng dụng của bạn. RSpec có nghĩa là để kiểm tra hành vi. Vì vậy, nó có thể tốt hơn nếu bạn viết các bài kiểm tra cho các hành vi có nguồn gốc từ home_team hoặc đi_team.

Lấy ví dụ nếu bạn muốn tên của home_team. Sẽ tốt hơn nếu bạn đã viết một phương pháp như sau:

def home_team_name 
    home_team.name 
end 

Đây là hành vi mà lớp sự kiện sẽ hỏi home_team. Bạn có thể viết thông số kỹ thuật như:

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 

Đây sẽ là ví dụ tuyệt vời về kiểm tra hành vi của liên kết mà không trực tiếp kiểm tra cấu trúc của ứng dụng của bạn.

Ngoài ra, như một điểm, Rails hy vọng rằng home_team là của lớp 'Đội', và không cần phải kiểm tra khuôn khổ, nó cũng được kiểm tra và tài liệu. Cách duy nhất mà tôi có thể thấy làm điều này sẽ là một cơ sở tạm thời, nếu bạn cần cải thiện sự hiểu biết của bạn về cách mà các vụ diệt chủng hoạt động.

+0

Cảnh báo: Tính năng này không hoạt động đối với tôi trừ khi tôi đã thực hiện '@home_team = Team.create (...' thay vì '.new (' vì có vẻ như AR không cung cấp id cho đến khi được lưu. – afxjzs

3

Đánh giá bởi shoulda-matchers source, bạn sẽ có thể làm điều gì đó giống như ...

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

hoặc

it { should belong_to(:home_team).class_name('Team') } 
Các vấn đề liên quan