2016-07-05 3 views
8

के बजाय मैजिकमॉक ऑब्जेक्ट देता है मेरे पास एक पायथन फ़ाइल a.py है जिसमें दो वर्ग A और B शामिल हैं।पायथन रिटर्न_वल्यू

class A(object): 
    def method_a(self): 
     return "Class A method a" 

class B(object): 
    def method_b(self): 
     a = A() 
     print a.method_a() 

मैं A मजाक द्वारा वर्ग B में method_b unittest करना चाहते हैं। यहाँ इस उद्देश्य के लिए फ़ाइल testa.py की सामग्री है:

import unittest 
import mock 
import a 


class TestB(unittest.TestCase): 

    @mock.patch('a.A') 
    def test_method_b(self, mock_a): 
     mock_a.method_a.return_value = 'Mocked A' 
     b = a.B() 
     b.method_b() 


if __name__ == '__main__': 
    unittest.main() 

मैं उत्पादन में Mocked A प्राप्त करने की उम्मीद। लेकिन मुझे क्या मिलता है:

<MagicMock name='A().method_a()' id='4326621392'> 

मैं गलत कहां कर रहा हूं?

+1

परीक्षण करते समय, 'ए() '' mock_A' से 'return_value' लौटाता है (एक नियमित' MagicMock', जैसा कि आपने कुछ और निर्दिष्ट नहीं किया है), जो कक्षा 'ए' का उदाहरण नहीं है। आपको उस 'return_value' को कुछ ऐसा करने के लिए सेट करना होगा जिसमें परिभाषित' method_a' हो। – jonrsharpe

+1

mock_a.method_a.return_value = 'मॉक ए' => mock_a()। Method_a.return_value = 'मॉक ए' बेहतर होना चाहिए :) –

+0

@AliSAIDOMAR ठीक है, यह 'mock_a' को कॉल करने से वापसी मूल्य है जिसमें होना चाहिए विधि, 'mock_a' स्वयं नहीं। – jonrsharpe

उत्तर

7

जब आप @mock.patch('a.A'), तो mock_a के साथ परीक्षण के तहत कोड A को प्रतिस्थापित कर रहे हैं।

B.method_b में आप तो a = A() सेट है, जो अब a = mock_a() है - यानी amock_a की return_value है। चूंकि आपने यह मान निर्दिष्ट नहीं किया है, यह नियमित MagicMock है; यह या तो कॉन्फ़िगर नहीं किया गया है, इसलिए आपको उस पर कॉल करने पर डिफ़ॉल्ट प्रतिक्रिया (अभी तक एक और MagicMock) मिलती है।

mock_a().method_a.return_value = 'Mocked A' 
    #^note parentheses 

या, शायद अधिक स्पष्ट रूप से:

इसके बजाय, आप उचित विधि है, जो या तो आप के रूप में कर सकते हैं के लिए mock_a की return_value कॉन्फ़िगर करना चाहते हैं

mock_a.return_value.method_a.return_value = 'Mocked A' 

आपका कोड a = A (कक्षा को असाइन करना, उदाहरण नहीं बना रहा) में काम किया होगा, क्योंकि a.method_a() आपके नकली विधि को ट्रिगर करेगा।