2014-12-02 9 views
7

साथ पारित कर दिया है मैं तर्क की तरह पारित कर रहे हैं, तो परीक्षण कर सकते हैं:परीक्षण करें कि ब्लॉक RSpec Mocks

RSpec.describe do 
    it do 
    obj = double 
    expect(obj).to receive(:method).with(1, 2, 3) 
    obj.method(1, 2, 3) 
    end 
end 

मैं एक ब्लॉक पैरामीटर के बारे में क्या करना चाहिए कैसे? मेरा आदर्श कोड:

RSpec.describe do 
    it do 
    obj = double 
    proc = Proc.new{} 
    expect(obj).to receive(:method).with(1, 2, 3).with_block(proc) 
    obj.method(1, 2, 3, &proc) 
    end 
end 
+0

इस सुविधा को रुपेक मुद्दों पर अनुरोध किया गया https://github.com/rspec/rspec-mocks/issues/1182 – hakunin

उत्तर

0

आप यह जांचने के लिए अपेक्षा का उपयोग नहीं कर सकते कि एक विशिष्ट ब्लॉक पारित किया गया है। आप देख सकते हैं कि एक कोड उदाहरण के लिए इसके अंदर कोड जोड़ने, द्वारा चलाया जाता है:

RSpec.describe do 
    it do 
    obj = double 
    block_is = double('block') 
    block = -> { 
     block_is.run 
    } 

    expect(obj).to receive(:method).with(1, 2, 3).and_yield 
    expect(block_is).to receive(:run) 

    obj.method(1, 2, 3, &block) 
    end 
end 
+0

धन्यवाद। and_yield थोड़ा मुश्किल लेकिन दिलचस्प है। – sh01ch1

+0

हम्म, मैं बस उपयोग करने में सक्षम हूं: (अनुमति दें (ओबीजे)। प्राप्त करने के लिए (: विधि) .with (1, 2, 3, और a_proc) .and_return (a_value) '। और यह अपेक्षित के रूप में काम किया .. संपादित करें: meh, rspec सिर्फ ब्लॉक को नजरअंदाज कर दिया गया है) – Waterlink

6

ऐसा लगता है कि मैं बस अगर एक ब्लॉक विधि श्रृंखलन के साथ पारित कर दिया है परीक्षण नहीं कर सकते।

RSpec.describe do 
    it do 
    obj = double 
    proc = Proc.new{} 
    expect(obj).to receive(:method).with(1, 2, 3) do |*args, &block| 
     expect(proc).to be(block) 
    end 
    obj.method(1, 2, 3, &proc) 
    end 
end 

हालांकि, हम receive(:method).with(1, 2, 3){|*| ...}.and_call_original की तरह एक ही समय में एक ब्लॉक कार्यान्वयन और अन्य प्रतिक्रिया विन्यास विधियों का उपयोग नहीं कर सकते हैं: और मैं एक सुस्त जवाब, ब्लॉक कार्यान्वयन पाया।

+0

मुझे आश्चर्य है कि क्या आप ब्लॉक कार्यान्वयन में 'सुपर (* args, और block) 'का उपयोग कर' .and_call_original' अनुकरण करने में सक्षम हो सकते हैं .... – Ajedi32

+0

आरएसपीईसी को ब्लॉक ब्लॉक में अंतिम बयान वापस करना चाहिए: –