2010-12-07 7 views
31

मैं सोच रहा था कि rspec में find_each कॉल का परीक्षण कैसे करें। मैं बस छोटा करते मैं क्या अपने मॉडल वापस जाने के लिए तो मैं इस तरह DB में परीक्षण डेटा पर भरोसा नहीं करना चाहते करने के लिए इस्तेमाल कर रहा हूँ:मैं रेल में rspec परीक्षण के लिए find_each कैसे लगा सकता हूं 3

MyClass.stub(:find).and_return(my_mock) 

बहरहाल, एक अन्य वर्ग में मैं यह कर रहा हूँ:

कल्पना की परीक्षा में

MyClass.stub(:find_each).and_return([one_mock, two_mock]) 

, "यहाँ चीजें करते" भाग निष्पादित नहीं किया जा रहा है:

MyClass.find_each do |instance_of_my_class| 
    do_stuff_here_on(instance_of_my_class) 
end 

मुझे लगता है कि यदि मैं यह कर सकते हैं। क्या किसी को पता है कि rspec परीक्षण के लिए find_each को कैसे दबाया जाए?

उत्तर

35

आप and_yield का उपयोग rspec बनाने के लिए कर सकते हैं ब्लॉक नकली के लिए पारित किया फोन:

MyClass.stub(:find_each).and_yield(one_mock).and_yield(two_mock) 
+0

ऐसा करने से निम्नलिखित त्रुटि उत्पन्न होती है | यहां मेरे मैक्स | 1. यदि मैं मैक को सरणी के रूप में पास करता हूं तो इसमें कोई समस्या नहीं है लेकिन find_each ब्लॉक में instance_of_my_class सरणी है और इसमें तत्व नहीं हैं। – Aaron

+4

'.and_yield (one_mock) .and_yield (two_mock)' के बारे में कैसे? – zetetic

+0

आप बिल्कुल सही हैं, ज़ेटेटिक - मैं अगली बार मेरी सलाह का परीक्षण करना सुनिश्चित करूँगा :) मैंने आपके सुधार को शामिल करने के लिए अपना उत्तर संपादित कर लिया है। – Iain

2

एक विधि को रगड़ने का पूरा बिंदु यह है कि विधि अपेक्षित मान देता है और इसकी सामग्री निष्पादित नहीं करता है। यदि आपके पास find_each विधि के भीतर तर्क का एक गुच्छा है, तो मैं इसे एक अलग विधि में ले जाने और तर्क को अलग से जांचने की अनुशंसा करता हूं। फिर आप परीक्षण कर सकते हैं कि निष्पादन के दौरान आपकी विधि को बुलाया जाता है।

class Example1 
    def my_method 
    # some logic 
    end 
end 

class Example2 
    def my_other_method 
    Example1.find_each(&:my_method) 
    end 
end 

Rspec:

describe Example1 do 
    it "should return something" do 
    example = Example1.new 
    example.my_method.should == something 
    end 
end 

describe Example2 do 
    it "should call my_method on Example1" do 
    example1 = mock(:example1, :my_method => true) 
    example2 = Example2.new 

    example1.should_receive(:my_method) 
    example2.my_other_method 
    end 
end 
+0

मैं वास्तव में एक और तरीका है कि मैं परीक्षण कर रहा हूँ में तर्क कर रहा हूँ। मैंने इसे प्रतिबिंबित करने के लिए अपने प्रश्न में find_each ब्लॉक को अद्यतन किया है। मैं परीक्षण करने की कोशिश कर रहा हूं कि यह उन सभी मैक्स पर करता है जो मैं पास करता हूं। – Aaron

1

यह

यहाँ एक बहुत ही उच्च स्तर उदाहरण है इसे करना चाहिए:

MyClass.stub(:find_each) {|block| 
    block.call 
    [one_mock, two_mock] 
} 

यदि do_stuff_here_on विश्व स्तर पर पहुंच योग्य नहीं है, उदा। some_object पर एक उदाहरण विधि, आप ब्लॉक के लिए सही गुंजाइश पाने के लिए कुछ instance_eval की आवश्यकता होगी:

MyClass.stub(:find_each) {|block| 
    some_object.instance_eval(&block) 
    [one_mock, two_mock] 
} 
संबंधित मुद्दे