2010-10-19 4 views
19

Sono nuovo per test e rail ma sto cercando di ottenere il mio processo TDD correttamente.Rails RSpec Test per un has_many: attraverso Relationship

Mi chiedevo se si utilizza qualche tipo di paradigma per testare has_many: attraverso le relazioni? (o semplicemente has_many in generale suppongo).

Ad esempio, trovo che nelle specifiche del mio modello scrivo sicuramente dei test semplici per verificare entrambi i fini di una relazione per i metodi correlati.

cioè:

require 'spec_helper' 

describe Post do 

    before(:each) do 
    @attr = { :subject => "f00 Post Subject", :content => "8ar Post Body Content" } 
    end 

    describe "validations" do 
    ...  
    end 

    describe "categorized posts" do 

    before(:each) do 
     @post = Post.create!(@attr) 
    end 

    it "should have a categories method" do 
     @post.should respond_to(:categories) 
    end 

    end 

end 

Poi nelle mie categorie spec faccio il test inversa e verificare la presenza di @ category.posts

Che altro mi manca? Grazie!!

risposta

47

Consiglierei di controllare una gemma chiamata Shoulda. Ha un sacco di macro per testare cose come le relazioni e le convalide.

Se invece si è interessati a testare l'esistenza della relazione has_many, allora si potrebbe effettuare le seguenti operazioni:

describe Post do 
    it { should have_many(:categories) } 
end 

Oppure, se si sta testando un has_many: attraverso, quindi devi usare questo:

describe Post do 
    it { should have_many(:categories).through(:other_model) } 
end 

Trovo molto utile anche la pagina Shoulda Rdoc.

+0

Ci sono delle cose comuni che fare personalmente durante il test? Sto cercando le cose di base che dovrei fare subito quando inizi. Cose come ... testare le mie associazioni sembra ragionevole ma dovrei quindi testare ogni metodo attraverso l'associazione? o come si fa a sapere quando fermarsi ?! lol –

+0

Mi piace molto usare questi test rapidi a una linea perché sono incredibilmente facili da configurare. Comincio sempre da questi e aggiungo ogni relazione e convalida, incluse tutte le associazioni. Non richiede molto lavoro e non aggiunge molti overhead ai test. Poi, mentre aggiungo funzionalità, aggiungerò ulteriori test unitari. Se scrivi i test per i tuoi modelli mentre scrivi il codice, ti costringe davvero a scrivere codice semplice e modulare. –

+0

come scrivere has_many attraverso l'associazione con expect syntex? – indb

1

remarkable farà questo bene:

describe Pricing do 

    should_have_many :accounts, :through => :account_pricings 
    should_have_many :account_pricings 
    should_have_many :job_profiles, :through => :job_profile_pricings 
    should_have_many :job_profile_pricings 

end 

In generale, basta copiare tutte le relazioni dal modello alle specifiche e il cambiamento "ha" a "should_have", "belongs_to" a "should_belong_to", e così via. Per rispondere all'accusa che sta testando i binari, controlla anche il database, assicurandosi che l'associazione funzioni.

Le macro sono inclusi anche per il controllo convalide così:

should_validate_numericality_of :amount, :greater_than_or_equal_to => 0 
+0

suoni straordinari! Lo stai usando con un rails3 env? –

+0

@Zaz, l'ho usato con Rails 2.2.3 e 2.3.9 finora. Credo che funzioni anche con Rails 3, ma non l'ho provato. –

2
describe "when Book.new is called" do 
    before(:each) do 
    @book = Book.new 
    end 

    #otm 
    it "should be ok with an associated publisher" do 
    @book.publisher = Publisher.new 
    @book.should have(:no).errors_on(:publisher) 
    end 

    it "should have an associated publisher" do 
    @book.should have_at_least(1).error_on(:publisher) 
    end 

    #mtm 
    it "should be ok with at least one associated author" do 
    @book.authors.build 
    @book.should have(:no).errors_on(:authors) 
    end 

    it "should have at least one associated author" do 
    @book.should have_at_least(1).error_on(:authors) 
    end 

end