2012-05-11 37 views
9

Tôi đang sử dụng Ruby on Rails 3.2.2, Rspec 2.9.0 và RspecRails 2.9.0. Tôi muốn kiểm tra các hành động điều khiển create nhưng tôi không biết làm thế nào để làm cho rằng "đúng"/"thích hợp" cách. Tôi "scaffolded" mô hình, bộ điều khiển, xem, ... tập tin, vì vậy trong những tập tin tôi có mã phổ biến được tạo ra bởi Ruby on Rails máy phát điện; trong file spec của tôi, tôi có:Cách thích hợp để kiểm tra hành động của bộ điều khiển 'tạo' là gì?

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 

Có lẽ, (lưu ý: mã trên là gần như giống nhau như mà tôi sử dụng để kiểm tra hành động new controller) một cách tốt hơn để kiểm tra create hành động điều khiển sẽ để chuyển một số giá trị thuộc tính trong hành động post :create thay vì tiếp tục như tôi thực hiện ở trên, nhưng tôi không biết cách thực hiện điều đó và nếu đó là cách "đúng"/"thích hợp" để thực hiện.

Vì vậy, cách thích hợp để kiểm tra hành động của bộ điều khiển 'tạo' là gì?

Trả lời

13

Làm thế nào về:

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

Có thể bạn sẽ nói '... {post: create,: article => article_params} .to ...' thay vì '... {post: create, article_params } .to ... '. – Backo

+0

điều chắc chắn, cố định, ta;) –

11

tôi đang làm nó theo cách này:

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 người gần đây đã viết cuốn sách Everyday Rails Testing with RSpec có một article at his blog. Nơi anh mô tả nó như thế này:

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 
Các vấn đề liên quan