2013-11-28 6 views
14

मैं कुछ कोडों का परीक्षण करने की कोशिश करता हूं जो कुछ भी वापस नहीं करते हैं लेकिन परिणाम को डीबी में सहेजते हैं। सेव विधि मजाक, मैं जाँच करने के लिए चीजों को ठीक से संसाधित किया गया है कि क्या चाहते हैं:पायथन में किसी ऑब्जेक्ट की नकली विधि में स्वयं को कैसे कॉल करें?

def mock_save(self): 
    assert(self.attr, 'dest_val') 
with mock.patch.object(Item, "save", create=True) as save: 
    save.side_effect = mock_save 
    func_to_call() //in func_to_call, I call item.save() 

हालांकि, ऐसा लगता है कि यह अनुमति नहीं है। यह कहता है कि तर्क विसंगति की संख्या।

यदि मैं def mock_save() def करता हूं, तो यह काम नहीं करेगा।

मैं उस वस्तु का संदर्भ कैसे रख सकता हूं जिस पर नकली विधि भी कार्य करती है?

उत्तर

14

आप की जरूरत है autospec=True

def mock_save(self): 
    assert self.attr == 'dest_val' 
with mock.patch.object(Item, "save", autospec=True) as save: 
    save.side_effect = mock_save 
    func_to_call() 
0

कुछ समय तुम सिर्फ जांच करने के लिए है कि एक विधि बुलाया गया है चाहता हूँ (मैं इसे एक और धागा जो init विधि है जो सीधे कक्षा से कहा जा सकता है पर लागू होता है में देखा था) , लेकिन आपके पास इस पर कोई नियंत्रण नहीं है कि इसकी कक्षा को तत्काल या विधि कहा जाता है। यहां एक ऐसा दृष्टिकोण है जो इस पैटर्न पर जो भी ठोकर खा सकता है:

# first get a reference to the original unbound method we want to mock 
original_save = Item.save 
# then create a wrapper whose main purpose is to record a reference to `self` 
# when it will be passed, then delegates the actual work to the unbound method 
def side_fx(self, *a, **kw): 
    side_fx.self = self 
    return original_save(self, *a, **kw) 
# you're now ready to play 
with patch.object(Item, 'save', autospec=True, side_effect=side_fx) as mock_save: 
    data = "the data" 
    # your "system under test" 
    instance = SomeClass() 
    # the method where your mock is used 
    instance.some_method(data) 

    # you now want to check if it was indeed called with all the proper arguments 
    mock_save.assert_called_once_with(side_fx.self, data) 
संबंधित मुद्दे