मैं मॉक ऑब्जेक्ट्स के लिए नया हूं, और मैं सीखने की कोशिश कर रहा हूं कि आरएसपीईसी में उनका उपयोग कैसे करें। क्या कोई आरएसपीसी मॉक ऑब्जेक्ट एपीआई का उपयोग करने के तरीके पर एक उदाहरण (एक हैलो आरएसपीसी मॉक ऑब्जेक्ट वर्ल्ड टाइप उदाहरण), या एक लिंक (या कोई अन्य संदर्भ) पोस्ट कर सकता है?आरएसपीसी मॉक ऑब्जेक्ट उदाहरण
उत्तर
यहाँ एक सरल नकली मैं एक रेल आवेदन पत्र में एक नियंत्रक परीक्षण के लिए किया था की एक उदाहरण है:
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
मेरे पास उत्तर में कोई टिप्पणी पोस्ट करने के लिए पर्याप्त अंक नहीं हैं लेकिन मैं यह कहना चाहता था कि स्वीकार्य उत्तर ने मुझे यादृच्छिक मूल्य में कैसे स्टब करने का प्रयास करने में मदद की।
मैं एक वस्तु के उदाहरण मूल्य है कि बेतरतीब ढंग से उदाहरण के लिए असाइन किया गया है ठूंठ करने में सक्षम होने की जरूरत:
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 गुजरता और असफलताओं हो रही थी।
तो तुम ब्रायन
वर्तमान (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 से बाहर ले जाया गया था।
धन्यवाद, -
अब बजाय हम
double
उपयोग कर सकते हैं। – agentbanks217में मदद मिली आप कक्षा के एक मॉक ऑब्जेक्ट को स्थापित कर रहे हैं जिसे आप speccing/test होना चाहते हैं जिसका अर्थ है कि आप वर्ग को बिल्कुल डिलीप्ड नहीं कर रहे हैं। व्यर्थ। मॉकिंग का मतलब कक्षा/प्रणाली को परीक्षण के तहत आपको वास्तविक दुनिया के रूप में वास्तविक/नियंत्रित/आत्मनिर्भर होने के बावजूद वास्तविक दुनिया के वातावरण के रूप में प्रस्तुत करने में मदद करने के लिए है। यह कक्षा के आंतरिक कार्यों को विकसित करने के लिए मॉकिंग का उपयोग करने के लिए एक विरोधी पैटर्न है। –
इसके अलावा, यह उत्तर पुराना है। शुद्ध मॉक ऑब्जेक्ट और [मेरा] (https://stackoverflow.com/a/39186152/634576) कैसे लिखना है, इसके लिए [टोकी का उत्तर नीचे देखें] (https://stackoverflow.com/a/39573538/634576) वर्तमान आरएसपीसी में आंशिक मॉकिंग करने के लिए। –