2009-10-16 10 views
8

मैं इस कोड मिल गया है से ब्लॉक उपज:Rspec Mocks: नकली/एक विधि कॉल

Net::SSH.start(@server, @username, :password => @password) do |ssh| 
      output = ssh.exec!(@command) 
      @logger.info 'SSH output: ' 
      @logger.info output 
     end 

मैं इस तरह RSpec के नकली ढांचे का उपयोग कर SSH.Start नकली कर सकते हैं, मुझे बताओ कि मैं है एसएसएच सत्र शुरू किया:

Net::SSH.should_receive(:start).with("server", "user", :password => "secret") do 
      @started = true 
     end 

यह मुझे बताता है कि मैंने एसएस सत्र को @ प्रारंभ किया है या नहीं। अब मुझे ssh.exec mock करने की जरूरत है! विधि, जो काफी आसान है:

Net::SSH.should_receive(:exec!).with("command")...

लेकिन मैं उस ब्लॉक को कैसे उत्पन्न/कॉल करूं जिसमें ssh.exec है! विधि कॉल, क्योंकि मैंने SSH.start विधि का मज़ाक उड़ाया है? संभवतया कुछ सरल विधि है जिसे मैं इस ब्लॉक को निष्पादित करने के लिए बुला सकता हूं, लेकिन मुझे नहीं पता कि यह क्या है और आरएसपीसी के मॉकिंग फ्रेमवर्क पर वास्तव में कोई अच्छी व्याख्या/दस्तावेज़ीकरण नहीं मिल रहा है।

उत्तर

19
Net::SSH.should_receive(:start).with(
    "server", "user", :password => "secret").and_yield(
    "whatever value the block should yield") 

तुम क्यों, @started निर्धारित करने की आवश्यकता सुनिश्चित नहीं हैं कि जब से should_receive पुष्टि करता है कि विधि बुलाया गया है।

+0

पता नहीं था कि must_receive के बारे में ... क्या इस सामान पर कोई अच्छा दस्तावेज है? मेरा google-fu मुझे विफल कर रहा है ... भी - अगर मुझे उपजित ब्लॉक के वापसी मूल्य की परवाह नहीं है तो क्या होगा? मैं बस इसे निष्पादित करना चाहता हूं, ताकि मैं ssh.exec पर should_receive को कॉल कर सकूं! तरीका। –

+0

यही है 'must_receive' का अर्थ है: यदि यह प्राप्त नहीं होता है, तो परीक्षण विफल हो जाएगा। जहां तक ​​प्रलेखन, आरएसपीसी बुक उत्कृष्ट है। मैं आरएसपीईसी का उपयोग सीखने और सामान्य रूप से बीडीडी के बारे में सीखने के लिए दोनों की सिफारिश करता हूं। – Avdi

+0

ओह, और आप बिना तर्क के '#and_yield()' को कॉल करने में सक्षम हो सकते हैं। – Avdi