2010-09-01 2 views
35

मैं मॉक ऑब्जेक्ट्स के लिए नया हूं, और मैं सीखने की कोशिश कर रहा हूं कि आरएसपीईसी में उनका उपयोग कैसे करें। क्या कोई आरएसपीसी मॉक ऑब्जेक्ट एपीआई का उपयोग करने के तरीके पर एक उदाहरण (एक हैलो आरएसपीसी मॉक ऑब्जेक्ट वर्ल्ड टाइप उदाहरण), या एक लिंक (या कोई अन्य संदर्भ) पोस्ट कर सकता है?आरएसपीसी मॉक ऑब्जेक्ट उदाहरण

उत्तर

62

यहाँ एक सरल नकली मैं एक रेल आवेदन पत्र में एक नियंत्रक परीक्षण के लिए किया था की एक उदाहरण है:

before(:each) do 
    @page = mock_model(Page) 
    @page.stub!(:path) 
    @page.stub!(:find_by_id) 
    @page_type = mock_model(PageType) 
    @page_type.stub!(:name) 
    @page.stub!(:page_type).and_return(@page_type) 
end 

इस मामले में, मैं पृष्ठ & पृष्ठ प्रकार मॉडल (वस्तुओं) मजाक कर रहा हूँ को छोटा करने के साथ ही कुछ तरीकों से मैं कॉल करता हूं।

यह मुझे इस तरह एक परीक्षण चलाने के लिए की क्षमता देता है:

it "should be successful" do 
    Page.should_receive(:find_by_id).and_return(@page) 
    get 'show', :id => 1 
    response.should be_success 
end 

मैं जानता हूँ कि क्या यह उत्तर अधिक रेल सटीक है, लेकिन मुझे आशा है कि यह आप के बाहर एक छोटे से मदद करता है।


संपादित

ठीक है, इसलिए यहाँ एक नमस्ते दुनिया उदाहरण है ...

निम्न स्क्रिप्ट (hello.rb) को देखते हुए:

class Hello 
    def say 
    "hello world" 
    end 
end 

हम बना सकते हैं निम्नलिखित कल्पना (hello_spec.rb):

require 'rubygems' 
require 'spec' 

require File.dirname(__FILE__) + '/hello.rb' 

describe Hello do 
    context "saying hello" do 
    before(:each) do 
     @hello = mock(Hello) 
     @hello.stub!(:say).and_return("hello world") 
    end 

    it "#say should return hello world" do 
     @hello.should_receive(:say).and_return("hello world") 
     answer = @hello.say 
     answer.should match("hello world") 
    end 
    end 
end 
+0

धन्यवाद, -

अब बजाय हम double उपयोग कर सकते हैं। – agentbanks217

+11

में मदद मिली आप कक्षा के एक मॉक ऑब्जेक्ट को स्थापित कर रहे हैं जिसे आप speccing/test होना चाहते हैं जिसका अर्थ है कि आप वर्ग को बिल्कुल डिलीप्ड नहीं कर रहे हैं। व्यर्थ। मॉकिंग का मतलब कक्षा/प्रणाली को परीक्षण के तहत आपको वास्तविक दुनिया के रूप में वास्तविक/नियंत्रित/आत्मनिर्भर होने के बावजूद वास्तविक दुनिया के वातावरण के रूप में प्रस्तुत करने में मदद करने के लिए है। यह कक्षा के आंतरिक कार्यों को विकसित करने के लिए मॉकिंग का उपयोग करने के लिए एक विरोधी पैटर्न है। –

+0

इसके अलावा, यह उत्तर पुराना है। शुद्ध मॉक ऑब्जेक्ट और [मेरा] (https://stackoverflow.com/a/39186152/634576) कैसे लिखना है, इसके लिए [टोकी का उत्तर नीचे देखें] (https://stackoverflow.com/a/39573538/634576) वर्तमान आरएसपीसी में आंशिक मॉकिंग करने के लिए। –

5

मेरे पास उत्तर में कोई टिप्पणी पोस्ट करने के लिए पर्याप्त अंक नहीं हैं लेकिन मैं यह कहना चाहता था कि स्वीकार्य उत्तर ने मुझे यादृच्छिक मूल्य में कैसे स्टब करने का प्रयास करने में मदद की।

मैं एक वस्तु के उदाहरण मूल्य है कि बेतरतीब ढंग से उदाहरण के लिए असाइन किया गया है ठूंठ करने में सक्षम होने की जरूरत:

class ClumsyPlayer < Player do 

    def initialize(name, health = 100) 
    super(name, health) 
    @health_boost = rand(1..10) 
    end 
end 

तब मेरे कल्पना में मैं पता लगाना परीक्षण करने के लिए अनाड़ी खिलाड़ी के यादृच्छिक स्वास्थ्य ठूंठ कैसे पर एक समस्या थी कि जब उन्हें ठीक हो जाए, तो उन्हें अपने स्वास्थ्य के लिए उचित बढ़ावा मिलता है।

चाल थी:

@player.stub!(health_boost: 5) 

ताकि stub! महत्वपूर्ण था, मैं सिर्फ stub उपयोग कर रहा था और अभी भी यादृच्छिक rspec गुजरता और असफलताओं हो रही थी।

तो तुम ब्रायन

0

वर्तमान (3.x) धन्यवाद RSpec (tokhi's answer के रूप में) दोनों शुद्ध नकली वस्तुओं और आंशिक मजाक (किसी मौजूदा ऑब्जेक्ट के लिए कॉल मजाक) प्रदान करता है। आंशिक मॉकिंग का एक उदाहरण यहां दिया गया है। यह और receive का उपयोग की कॉल को CreditCardService पर कॉल करने के लिए करता है, ताकि परीक्षण केवल तभी गुजरता है जब कॉल वास्तव में इसे बनाने के बिना किया जाता है।

class Order 
    def cancel 
    CreditCardService.instance.refund transaction_id 
    end 
end 

describe Order do 
    describe '#cancel' do 
    it "refunds the money" do 
     order = Order.new 
     order.transaction_id = "transaction_id" 
     expect(CreditCardService.instance).to receive(:refund).with("transaction_id") 
     order.cancel 
    end 
    end 
end 
इस उदाहरण नकली CreditCardService.instance की वापसी मूल्य है, जो संभवतः एक सिंगलटन है पर है

with वैकल्पिक है; इसके बिना, refund पर कोई भी कॉल उम्मीद को पूरा करेगा। एक वापसी मूल्य and_return के साथ दिया जा सकता है; इस उदाहरण में इसका उपयोग नहीं किया जाता है, इसलिए कॉल nil देता है।


यह उदाहरण RSpec के वर्तमान (expect .to receive) मजाक वाक्य रचना है, जो किसी भी वस्तु के साथ काम करता उपयोग करता है। स्वीकार्य उत्तर पुराने rspec-rails mock_model विधि का उपयोग करता है, जो ActiveModel मॉडल के लिए विशिष्ट था और किसी अन्य मणि में rspec-rails से बाहर ले जाया गया था।

4

mock इस जिथब pull के आधार पर बहिष्कृत किया गया है। उदाहरण के लिए यह deff अधिक here...

before(:each) do 
    @page = double("Page") 
    end 

    it "page should return hello world" do 
    allow(@page).to receive(:say).and_return("hello world") 
    answer = @page.say 
    expect(answer).to eq("hello world") 
    end