2012-05-18 11 views
16

में काम करता है माइकल हार्टल द्वारा रूबी ऑन रेल ट्यूटोरियल के माध्यम से जाने के दौरान, जहां लेखक अपने साइनअप पेज को सत्यापित करने के लिए एकीकरण परीक्षण लिखता है, उसने कोड स्पिनेट बोले का उपयोग किया है। मुझे कोड मिला जो मुझे 'कैसे' भाग के आसपास अपना सिर नहीं मिला। निष्पादन के आदेश को समझ नहीं सका।आरएसपीसी की आरओआर

expect { click_button "Create my account" }.not_to change(User, :count) 

क्या कोई उपरोक्त श्रृंखला के तरीकों और ब्लॉक के अर्थशास्त्र को समझा सकता है और वे एक साथ कैसे फिट हो सकते हैं?

+3

यह कैपिबरा नहीं है, यह आरएसपीईसी है। –

+0

@RyanBigg धन्यवाद, बस इसे ठीक किया। अच्छे उदाहरणों के लिए – Bedasso

उत्तर

45

आप expect ... change का उपयोग करेंगे कि एक विशेष विधि कॉल परिवर्तन सत्यापित करने के लिए - या नहीं बदलता है - कुछ अन्य मूल्य। इस मामले में:

expect { click_button "Create my account" }.not_to change(User, :count) 

निम्न करने के लिए rspec कारण होगा:

  1. भागो User.count और दिए गए मान को नोट करें। (यह एक रिसीवर और एक विधि नाम के रूप में, (User, :count) की तरह अपने उदाहरण में,, { User.count } की तरह निर्दिष्ट किया जा सकता या कोड का एक मनमाना ब्लॉक के रूप में।
  2. भागो click_button "Create my account" जो एक Capybara विधि है कि एक लिंक पर एक माउस क्लिक simulates है।
  3. ।।
  4. भागो User.count फिर
  5. # 1 और # 3 की परिणामों की तुलना करें अगर वे भिन्न होते हैं, उदाहरण के विफल रहता है कि वे एक ही कर रहे हैं, यह गुजरता

अन्य तरीके expect ... change उपयोग करने के लिए:।।

expect { thing.destroy }.to change(Thing, :count).from(1).to(0) 
expect { thing.tax = 5 }.to change { thing.total_price }.by(5) 
expect { thing.save! }.to raise_error 
expect { thing.symbolize_name }.to change { thing.name }.from(String).to(Symbol) 

कुछ दस्तावेज़ here हैं।

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

अद्यतन

एक और जवाब पर अपनी टिप्पणी देखने के बाद, मैं आपरेशन के आदेश के बारे में थोड़ा जोड़ देंगे। अनजान चाल यह है कि यह matcher (change इस मामले में) है जो सभी ब्लॉक निष्पादित करता है। expect में लैम्ब्डा है, not_toshould_not के लिए उपनाम है जिसका काम लैम्ब्डा को मैचर पर पास करना है। इस मामले में matcher change है जो एक बार अपने तर्क को निष्पादित करने के बारे में जानता है, फिर इसे पारित किया गया लैम्ब्डा निष्पादित करें (expect से एक), फिर चीजों को बदलने के लिए फिर से अपना तर्क चलाएं। यह मुश्किल है क्योंकि रेखा दिखती है कि इसे बाएं से दाएं निष्पादित करना चाहिए, लेकिन चूंकि अधिकांश टुकड़े सिर्फ कोड के ब्लॉक के चारों ओर गुजर रहे हैं, इसलिए वे उन्हें किसी भी क्रम में मफल करने के लिए सबसे अधिक समझ में डाल सकते हैं।

मैं rspec internals पर एक विशेषज्ञ नहीं हूं, लेकिन यह मूल विचार की मेरी समझ है।

+0

मैंने कभी भी एसओ पर सबसे विस्तृत और सहायक उत्तर पढ़ा है। अगर मैं कर सकता तो मैं इस 100x को ऊपर उठाऊंगा। धन्यवाद! –

4

यहाँ से Ryan Bates Railscast on Request Specs and Capybara

require 'spec_helper' 

describe "Tasks" do 
    describe "GET /tasks" do 
    it "displays tasks" do 
     Task.create!(:name => "paint fence") 
     visit tasks_path 
     page.should have_content("paint fence") 
    end 
    end 

    describe "POST /tasks" do 
    it "creates a task" do 
     visit tasks_path 
     fill_in "Name", :with => "mow lawn" 
     click_button "Add" 
     page.should have_content("Successfully added task.") 
     page.should have_content("mow lawn") 
    end 
    end 
end 

से एक अंश है और यहाँ the docs on RSPec Expectations

describe Counter, "#increment" do 
    it "should increment the count" do 
    expect{Counter.increment}.to change{Counter.count}.from(0).to(1) 
    end 

    # deliberate failure 
    it "should increment the count by 2" do 
    expect{Counter.increment}.to change{Counter.count}.by(2) 
    end 
end 

तो मूल रूप से से एक अंश है,

expect { click_button "Create my account" }.not_to change(User, :count) 

हिस्सा RSpec है:

expect {...}.not_to change(User, :count) 

और भाग Capybara

click_button "Create my account" 

(यहाँ a link to the Capyabara DSL है - आप click_button लिए खोज सकते हैं)

ऐसा लगता है कि आप उन दोनों के साथ एक समग्र उदाहरण के लिए देख रहे हैं। यह एक आदर्श उदाहरण नहीं है, लेकिन यह कुछ इस तरह दिख सकता है:

describe "Tasks" do 
    describe "GET /tasks" do 
    it "displays tasks" do 
     expect { click_button "Create my account" }.not_to change(User, :count) 
    end 
    end 
end 
+0

टीएनएक्स। अभिव्यक्ति के अर्थशास्त्र को जानने में मुझे अधिक दिलचस्पी थी जैसे कि कैसे खुराक '.. (..)' दो बार निष्पादित किया जाता है और निष्पादन का समग्र क्रम होता है। – Bedasso