2014-04-18 7 views
7

मैंने बहुत कुछ खोजा है और इसे समझ नहीं सकता है हालांकि यह मूल लगता है। मैं जो करना चाहता हूं उसका सरलीकृत उदाहरण यहां दिया गया है। इस तरह के "अलविदा" के रूप मेंरुपयेपेक 3.0 पैरामीटर को बदलने की विधि को कैसे नकल करें लेकिन बिना वापसी मूल्य के?

class Test 
    def test_method(param) 
    puts param 
    end 
    test_method("hello") 
end 

लेकिन मेरे rspec परीक्षण में मैं एक अलग पैरामीटर पारित करने के लिए की जरूरत है, के बजाय "हैलो:

एक सरल विधि है कि कुछ करता है लेकिन इस तरह के रूप में कुछ भी वापस नहीं करता है, बनाएं । " मैं जानता हूँ कि इस स्टब्स और mocks के साथ क्या करना है, और मैं प्रलेखन से अधिक लग रही है, लेकिन यह पता नहीं कर सकते हैं: https://relishapp.com/rspec/rspec-mocks/v/3-0/docs/method-stubs

अगर मैं कार्य करें:

@test = Test.new 
allow(@test).to_receive(:test_method).with("goodbye") 

यह मुझसे कहता है एक बाहर ठूंठ डिफ़ॉल्ट मान लेकिन मैं यह नहीं समझ सकता कि इसे सही तरीके से कैसे किया जाए।

त्रुटि संदेश: कुछ की तरह

@test.stub(:test_method) 

received :test_method with unexpected arguments 
    expected: ("hello") 
    got: ("goodbye") 
Please stub a default value first if message might be received with other args as well.  

मैं rspec 3.0 का उपयोग कर रहा है, और फोन करने की अनुमति नहीं है।

+0

पर आपका त्रुटि संदेश आपके स्टब के विपरीत लगता है। –

उत्तर

1
अपने उदाहरण के लिए

, जब से तुम test_method की वास्तविक परिणाम परीक्षण करने के लिए, केवल कि puts यह param में पारित करने में बुलाया जाता है की जरूरत नहीं है, मैं सिर्फ उम्मीद की स्थापना और विधि चलाकर परीक्षण होगा:

class Test 
    def test_method(param) 
    puts param 
    end 
end 

describe Test do 
    let(:test) { Test.new } 

    it 'says hello via expectation' do 
    expect(test).to receive(:puts).with('hello') 
    test.test_method('hello') 
    end 

    it 'says goodbye via expectation' do 
    expect(test).to receive(:puts).with('goodbye') 
    test.test_method('goodbye') 
    end 
end 

क्या यह आपको बस इतना करना विधि पर एक test spy की स्थापना की है प्रयास कर रहे हैं, लेकिन फिर मुझे लगता है कि आप को विधि ठूंठ puts करने के लिए कॉल की एक स्तर बहुत अधिक (अपने आप test_method पर स्थापित कर रहे हैं के बजाय लगता है test_method के अंदर)। आप puts को फोन पर ठूंठ डालते हैं, तो अपने परीक्षण पास करना चाहिए:

describe Test do 
    let(:test) { Test.new } 

    it 'says hello using a test spy' do 
    allow(test).to receive(:puts).with('hello') 
    test.test_method('hello') 
    expect(test).to have_received(:puts).with('hello') 
    end 

    it 'says goodbye using a test spy' do 
    allow(test).to receive(:puts).with('goodbye') 
    test.test_method('goodbye') 
    expect(test).to have_received(:puts).with('goodbye') 
    end 
end 
+1

धन्यवाद - यह सहायक है! एक के लिए, मुझे नहीं पता था कि आप 'उम्मीद (परीक्षण) कह सकते हैं। (: रखता है)' - मैंने सोचा था कि आप केवल सीधे विधि ('test_method') को कॉल कर सकते हैं ताकि जानना अच्छा हो। अंत में मेरी वास्तविक समस्या अधिक जटिल थी और मैंने फैसला किया कि मुझे बस उस विधि को परिभाषित करने के लिए अपना कोड बदलने की जरूरत है जो * एक * मूल्य वापस कर देता है, जो शायद वैसे भी बेहतर अभ्यास है। और फिर 'अनुमति (परीक्षण) का उपयोग करना आसान है। (: Test_method) .and_return (' अलविदा ') '। मुझे यकीन है कि इनमें से कुछ का उपयोग करके एक और तरीका है, और टेस्ट जासूसों के बारे में जानना भी अच्छा है - मैं इससे पहले नहीं आया था। – user3060126

4

कैसे एक डिफ़ॉल्ट मान है कि

and_call_original can configure a default response that can be overriden for specific args

require 'calculator' 

RSpec.describe "and_call_original" do 
    it "can be overriden for specific arguments using #with" do 
    allow(Calculator).to receive(:add).and_call_original 
    allow(Calculator).to receive(:add).with(2, 3).and_return(-5) 

    expect(Calculator.add(2, 2)).to eq(4) 
    expect(Calculator.add(2, 3)).to eq(-5) 
    end 
end 

स्रोत पर समझाया गया है, जहां मैं के लिए आया था स्थापित करने के लिए इसके बारे में जानें https://makandracards.com/makandra/30543-rspec-only-stub-a-method-when-a-particular-argument-is-passed

संबंधित मुद्दे