2012-05-11 8 views
9

Estoy usando Ruby on Rails 3.2.2, Rspec 2.9.0 y RspecRails 2.9.0. Me gustaría probar la acción del controlador create, pero no sé cómo hacerlo de la manera "correcta"/"adecuada". Yo "scaffolded" el modelo, el controlador, la vista, ... archivos, entonces en esos archivos tengo el código común generado por los generadores de Ruby on Rails; en mi archivo de especificaciones que tengo:¿Cuál es la forma correcta de probar "crear" acciones de controlador?

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 

Tal vez, (nota: el código anterior es casi el mismo que el que utilizo para probar la acción new controlador) una mejor manera de probar create acciones del controlador sería pasar algún valor de atributo durante la acción post :create en lugar de proceder como lo hago por encima de, pero no sé cómo hacer eso y si es la forma "correcta"/"propia" de hacer las cosas.

Entonces, ¿cuál es la forma correcta de probar las acciones de 'crear' del controlador?

Respuesta

13

¿Qué tal:

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

Tal vez usted podría decir '... {mensaje: crear,: article => article_params} .a ...' en lugar de '... {mensaje: crear, article_params } .to ... '. – Backo

+0

algo seguro, fijo, ta;) –

11

que estoy haciendo de esta manera:

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 quien recientemente escribió el libro Everyday Rails Testing with RSpec tienen un article at his blog. Donde describe así:

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 
Cuestiones relacionadas