2012-02-03 7 views
5

Dato il codice qui sotto:Rails/Rspec - scrittura spec per il nome della classe di associazione belongs_to

(1) Come vorresti scrivere una specifica per verificare che il nome della classe di HOME_TEAM e AWAY_TEAM dovrebbe essere una classe della squadra?

(2) Si dovrebbe anche preoccuparsi di scrivere una tale specifica? Non sono sicuro di vedere il valore nel farlo, ma volevo avere i tuoi pensieri.

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 

Sarebbe bello se shoulda aveva qualcosa di simile:

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

risposta

5

Ecco un post sul perché questo in realtà non dovrebbe essere fatto:

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

In sintesi, le associazioni sono la struttura della vostra applicazione. RSpec è pensato per testare i comportamenti. Quindi, è probabilmente meglio se si scrivono test per il comportamento derivato da home_team o away_team.

Prendiamo ad esempio se si desidera il nome di home_team. Sarebbe meglio se hai scritto un metodo come questo:

def home_team_name 
    home_team.name 
end 

Questo è un comportamento che la classe evento sarebbe chiedere al HOME_TEAM per. Si potrebbe scrivere una specifica come ad esempio:

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 

Questo sarebbe un grande esempio di testare il comportamento dell'associazione, senza prove direttamente la struttura della vostra applicazione.

Inoltre, Rails si aspetta che home_team sia di classe "Team" e non è necessario testare il framework, è ben testato e documentato. L'unico modo in cui potrei vedere farlo sarebbe su una base temporanea, se avessi bisogno di migliorare la tua comprensione del modo in cui funzionano le associazioni.

+0

Heads Up: Questo non funzionava per me a meno che non fossi '@home_team = Team.create (...' invece di '.new (' perché sembra che AR non dia un ID finché non viene salvato. – afxjzs

3

A giudicare dal shoulda-matchers source, si dovrebbe essere in grado di fare qualcosa di simile ...

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

o

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