2012-05-11 10 views
9

Sto usando Ruby on Rails 3.2.2, Rspec 2.9.0 e RspecRails 2.9.0. Vorrei testare l'azione del controller create ma non so come farlo in modo "giusto"/"corretto". Ho "impalcato" modelli, controller, vista, ... file, quindi in quei file ho il codice comune generato dai generatori di Ruby on Rails; nel mio file spec ho:Qual è il modo corretto di testare le azioni del controller 'create'?

it "assigns @article" do 
    new_article = FactoryGirl.build(:article) 
    Article.should_receive(:new).and_return(new_article) 
    post :create 
    assigns[:article].should eq(new_article) 
end 

Forse, (nota: il codice di cui sopra è quasi lo stesso di quello che uso per testare l'azione new controllore) un modo migliore per testare create azioni di controllo sarebbe per passare qualche valore di attributo durante l'azione post :create invece di procedere come faccio sopra lo, ma non so come farlo e se è il modo "giusto"/"corretto" per fare le cose.

Quindi, qual è il modo corretto per testare le azioni del controller 'create'?

risposta

13

ne dite:

it "creates article" do 
    article_params = FactoryGirl.attributes_for(:article) 
    expect { post :create, :article => article_params }.to change(Article, :count).by(1) 
end 
+0

Forse si direbbe '... {postale: creare,: Articolo => article_params} .to ...' invece di '... {postale: creare, article_params } .to ... '. – Backo

+0

sicuro, fisso, ta;) –

11

sto facendo in questo modo:

describe "#create" do 
    before { post :create, { "my_model"=> { "name"=>"name" } } } 
    specify("should created one my_model") { change{ MyModel.count }.from(0).to(1) } 
end 

Aaron Sumner che recentemente ha scritto il libro Everyday Rails Testing with RSpec hanno un article at his blog. Dove descrive in questo modo:

describe "POST create" do 
    context "with valid attributes" do 
    it "creates a new contact" do 
     expect{ 
     post :create, contact: Factory.attributes_for(:contact) 
     }.to change(Contact,:count).by(1) 
    end 

    it "redirects to the new contact" do 
     post :create, contact: Factory.attributes_for(:contact) 
     response.should redirect_to Contact.last 
    end 
    end 

    context "with invalid attributes" do 
    it "does not save the new contact" do 
     expect{ 
     post :create, contact: Factory.attributes_for(:invalid_contact) 
     }.to_not change(Contact,:count) 
    end 

    it "re-renders the new method" do 
     post :create, contact: Factory.attributes_for(:invalid_contact) 
     response.should render_template :new 
    end 
    end 
end 
Problemi correlati