2012-05-11 24 views
9

Ich verwende Ruby on Rails 3.2.2, Rspec 2.9.0 und RspecRails 2.9.0. Ich möchte die create Controller-Aktion testen, aber ich weiß nicht, wie man das "richtig"/"richtig" macht. Ich "gerüstete" Modell, Controller, Ansicht, ... Dateien, so in diesen Dateien habe ich den gemeinsamen Code von Ruby on Rails Generatoren erzeugt; Ich habe in meiner Spec-Datei:Was ist der richtige Weg, um Controller-Aktionen zu erstellen?

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 

Vielleicht (Note: der obige Code ist fast das gleiche wie die Ich benutze die new Controller-Aktion zu testen) einen besserer Weg create Controller-Aktionen zu testen wäre um einen Attributwert während der post :create Aktion zu übergeben, anstatt fortzufahren, wie ich oben mache, aber ich weiß nicht, wie man das macht und ob es die "richtige"/"richtige" Art ist, Dinge zu machen.

Also, Was ist der richtige Weg zu testen "Erstellen" Controller-Aktionen?

Antwort

13

Wie wäre:

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

Vielleicht würden Sie sagen, '... {Beitrag: Erstellen: article => article_params} .to ...' statt '... {Beitrag: erstellen, article_params } .to ... '. – Backo

+0

sicher, fest, ta;) –

11

ich es so mache:

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, der vor kurzem das Buch schrieb Everyday Rails Testing with RSpec haben eine article at his blog. Wo er es wie folgt beschreibt:

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 
Verwandte Themen