2012-05-11 6 views
9

मैं रूबी 3.2.2, रुपेक 2.9.0 और रुपेकेल 2.9.0 पर रूबी का उपयोग कर रहा हूं। मैं 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 

हो सकता है, (टिप्पणी: उपरोक्त कोड लगभग समान है मैं new नियंत्रक कार्रवाई परीक्षण करने के लिए उपयोग करें) एक बेहतर तरीका 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

निश्चित बात, तय, टा;) –

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 
संबंधित मुद्दे

 संबंधित मुद्दे