2012-02-10 4 views
26

मैं रेलों और बीडीडी वर्कफ़्लो की मेरी समझ को मजबूत करने की कोशिश कर रहा हूं, इसलिए मैं उन मिनी ब्लॉगों में से एक बनाकर छोटा शुरू करना चाहता था, लेकिन आरएसपीईसी के साथ। अभी मेरे पास एक लेख नियंत्रक और आलेख मॉडल है, और संबंधित rspec फ़ाइलें हैं। अनुच्छेद बहुत सरल है, केवल शीर्षक है: स्ट्रिंग और सामग्री: टेक्स्ट, और आलेख नियंत्रक रीस्टफुल है - हालांकि मैंने लेख के लिए एमसीवी लिखा है, यह मूल रूप से वैसे ही है जैसे मैंने इसे बनाने के लिए एक मचान का उपयोग किया था।एक साधारण PUT अद्यतन के लिए आरएसपीसी परीक्षण कैसे लिखें?

हालांकि मुझे वास्तव में पता नहीं है कि मैं PUT अद्यतन के लिए rspec में एक परीक्षण लिखने के दौरान क्या कर रहा हूं। मैं लेख वस्तु बनाने के लिए फैक्टरी लड़की का उपयोग कर रहा है, और अब तक मेरे कोड की तरह दिखता है:

#factories.rb 
FactoryGirl.define do 
    factory :article do 
    title "a title" 
    content "hello world" 
end 

#articles_controller_spec.rb 
before(:each) do 
    @article = Factory(:article) 
end 

describe "PUT 'update/:id'" do 
    it "allows an article to be updated" do 
    @attr = { :title => "new title", :content => "new content" } 
    put :update, :id => @article.id, :article => @attr 
    response.should be_successful 
    end 
end 

हालांकि मैं बार आ रही है:

Failures: 
1) ArticlesController PUT 'update/:id' allows an article to be updated 
    Failure/Error: response.should be_successful 
    expected successful? to return true, got false 

क्या मैं गलत कर रहा हूँ? और क्या मैं सही उपकरण का उपयोग कर रहा हूं? जब मैं अपना टेस्ट सर्वर चलाता हूं, नया, संपादित करता हूं, सभी कामों को नष्ट कर देता हूं क्योंकि मैं उन्हें उम्मीद करता हूं, इसलिए मुझे लगता है कि यह आरएसपीईसी की मेरी समझ के साथ एक समस्या है। अगर मैं गलत हूं तो मुझे बताएं - धन्यवाद!

+0

क्या आपके नियंत्रक और मॉडल की तरह दिखता है? –

उत्तर

51

आप अपने @article.reload करना भूल गया, और update कार्रवाई पर अपनी प्रतिक्रिया सबसे अधिक संभावना अनुप्रेषित प्रदर्शन, इसलिए

RSpec 2:

describe "PUT update/:id" do 
    let(:attr) do 
    { :title => 'new title', :content => 'new content' } 
    end 

    before(:each) do 
    put :update, :id => @article.id, :article => attr 
    @article.reload 
    end 

    it { response.should redirect_to(@article) } 
    it { @article.title.should eql attr[:title] } 
    it { @article.content.should eql attr[:content] } 
end 

Rspec 3:

describe "PUT update/:id" do 
    let(:attr) do 
    { :title => 'new title', :content => 'new content' } 
    end 

    before(:each) do 
    put :update, :id => @article.id, :article => attr 
    @article.reload 
    end 

    it { expect(response).to redirect_to(@article) } 
    it { expect(@article.title).to eql attr[:title] } 
    it { expect(@article.content).to eql attr[:content] } 
end 
+0

भी नए मैचर सिंटैक्स के रूप में यह @ article.title.should eq @attr [: title] – engineerDave

+1

आपके सुंदर छोटी आत्मा को आशीर्वाद देगा। मैं अपने wits अंत में था। – Matt

+3

नया वाक्यविन्यास होना चाहिए: 'उम्मीद (@ article.title)। Eq @attr [: title]'। – Nick

1
FactoryGirl.define :article do 
    title "a title" 
    content "hello world" 
end 

before(:each) do 
    @article = Factory(:article) 
end 

it "should re-render edit template on failed update" do 
    @attr = { :title => "", :content => "new content" } 
    put :update, :id => @article.id, :article => @attr 

    flash[:notice].should be_nil 
    response.should render_template('edit') 
end 

it "should redirect to index with a notice on successful update" do 
    @attr = { :title => "new title", :content => "new content" } 
    put :update, :id => @article.id, :article => @attr 

    assigns[:article].should_not be_new_record 
    flash[:notice].should_not be_nil 
    response.should redirect_to(:action => 'index') 
end 
+0

क्या अद्यतन के लिए POST का उपयोग करना संभव है? – KnownColor

+1

@KownownColor डिफ़ॉल्ट अद्यतन द्वारा अनुरोध किया जाता है लेकिन आप इसे हमेशा ओवरराइड कर सकते हैं। –

5

आप कर रहे हैं जब एक PUT :update याद यदि आप एक मौजूदा मॉडल है, जो आप put में कॉल करने की आवश्यकता संपादन कर रहे हैं कि। बस अपने @article पास करें और निम्नानुसार गुण अपडेट करें।

describe "PUT 'update/:id'" do 
    it "allows an article to be updated" do 
    put :update, :id => @article.id, :article => @article.attributes = { :title => "new title", :content => "new content" } 
    response.should be_successful 
    end 
end 
0

जिस तरह से मैं अद्यतन विधि का परीक्षण करना चाहता हूं यह सुनिश्चित करना है कि अपडेट किया गया समय पहले से अधिक था। जब आप ऐसा करते हैं तो आप पूरे इंस्टेंस चर की सामग्री बदल सकते हैं और फिर भी जांच सकते हैं कि सब कुछ अपडेट किया गया था या नहीं। उदाहरण के लिए:

describe "PUT 'update/:id'" do 
    it "allows an article to be updated" do 
    prev_updated_at = @article.updated_at 
    @attr = { :title => "new title", :content => "new content" } 
    put :update, :id => @article.id, :article => @attr 
    @article.reload 
    @article.updated_at.should != prev_updated_at 
    end 
end 
+0

आप कोड का दावा करते हैं कि समय समान हैं, जैसा कि आप वर्णन करते हैं उतना अलग नहीं है। – KnownColor