2012-05-11 5 views
9

Я использую Ruby on Rails 3.2.2, Rspec 2.9.0 и RspecRails 2.9.0. Я хотел бы протестировать действие контроллера create, но я не знаю, как сделать это «правильным»/«правильным» способом. Я «скрывал» модель, контроллер, просмотр, ... файлы, поэтому в этих файлах у меня есть общий код, сгенерированный генераторами Ruby on Rails; в моем файле спецификации у меня есть:Каков правильный способ тестирования действий «создать» контроллера?

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 

Может быть, (примечание: приведенный выше код почти такой же, как я использую, чтобы проверить действие new контроллера) лучший способ проверить create действия контроллера будет для передачи некоторого значения атрибута во время действия post :create вместо продолжения, поскольку я делаю выше, но я не знаю, как это сделать, и если это «правильный»/«правильный» способ сделать вещи.

Итак, Каков правильный способ тестирования действий «создать» контроллера?

ответ

13

Как насчет:

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

Может быть, вы могли бы сказать '... {почта: создание,: статья => article_params} .то ...' вместо '... {почта: создание, article_params } .to ... '. – Backo

+0

уверенный вещь, фиксированный, ta;) –

11

Я делаю это так:

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

Аарон Самнер, который недавно написал книгу Everyday Rails Testing with RSpec имеют article at his blog. Где он описывает это следующим образом:

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 
Смежные вопросы