2012-02-03 8 views
5

Teniendo en cuenta el código de abajo:rieles/Rspec - escritura de especificaciones para el nombre de la clase de asociación belongs_to

(1) ¿Cómo escribir una especificación para probar que el nombre de la clase de HOME_TEAM y AWAY_TEAM debe ser una clase de equipo?

(2) ¿Debería incluso molestarse en escribir tal especificación? No estoy seguro de ver el valor de hacerlo, pero quería tener tus pensamientos.

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 

sería bueno si la debería haber tenido algo como:

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

Respuesta

5

Aquí es una entrada de blog acerca de por qué esto realmente no se debe hacer:

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

En resumen, las asociaciones son la estructura de su aplicación. RSpec está destinado a probar comportamientos. Por lo tanto, es probablemente mejor si escribe pruebas para el comportamiento que se deriva de home_team o away_team.

Tome, por ejemplo, si quiere el nombre del equipo home_team. Sería mejor si usted escribió un método como este:

def home_team_name 
    home_team.name 
end 

Este es un comportamiento que la clase de evento pediría al HOME_TEAM para. Se podría escribir una especificación tales como:

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 

esto sería un gran ejemplo de probar el comportamiento de la asociación, sin probar directamente la estructura de su aplicación.

Además, como un punto, Rails espera que home_team sea de clase 'Team', y no hay necesidad de probar el framework, está bien probado y documentado. La única forma en que podría verlo sería temporalmente, si necesitaras mejorar tu comprensión de la forma en que funcionan las asociaciones.

+0

Heads Up: Esto no me funcionaba a menos que lo hiciera '@home_team = Team.create (...' en lugar de '.new (' porque parece que AR no proporciona una identificación hasta que se guarde). – afxjzs

3

A juzgar por el shoulda-matchers source, usted debería ser capaz de hacer algo así ...

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

o

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