2012-05-11 13 views
6

मैं इस परिदृश्य है: मेरे models.pyमजाक Django मॉडल और बचाने()

class FooBar(models.Model): 
    description = models.CharField(max_length=20) 
मेरी utils.py फ़ाइल में

में

from models import FooBar 

def save_foobar(value): 
    '''acts like a helper method that does a bunch of stuff, but creates a 
    FooBar object and saves it''' 

    f = FooBar(description=value) 
    f.save() 
tests.py

from utils import save_foobar 

@patch('utils.FooBar') 
def test_save_foobar(self, mock_foobar_class): 

    save_mock = Mock(return_value=None) 
    mock_foobar_class.save = save_mock 

    save_foobar('some value') 

    #make sure class was created 
    self.assertEqual(mock_foobar_class.call_count, 1) #this passes!!! 

    #now make sure save was called once 
    self.assertEqual(save_mock.call_count, 1) #this fails with 0 != 1 !!! 

यह वह जगह है कि मुझे क्या करना कोशिश कर रहा हूँ की एक सरलीकृत संस्करण ... तो क्यों मैं एक utils फ़ाइल है पर hungup नहीं मिलता है तो कृपया और एक में

इसके लिए सहायक कार्य (वास्तविक जीवन में यह कई चीजें करता है)। साथ ही, कृपया ध्यान दें, सरलीकृत होने पर, यह मेरी समस्या का वास्तविक कार्य उदाहरण है। Call_count का परीक्षण करने वाला पहला कॉल 1 और पास देता है। हालांकि, दूसरा एक 0 देता है। तो, ऐसा लगता है जैसे मेरा पैच काम कर रहा है और बुला रहा है।

मैं कैसे परीक्षण कर सकता हूं कि न केवल FooBar का एक उदाहरण बनता है, बल्कि यह भी कि उस पर सहेजने की विधि कहलाती है?

उत्तर

7

यहाँ आपकी समस्या है, यदि आप वर्तमान में है:

mock_foobar_class.save = save_mock 

mock_foobar_class के बाद से एक मज़ाक उड़ाया वर्ग वस्तु है, और save विधि उस वर्ग (कक्षा में ही नहीं) का एक उदाहरण पर कहा जाता है, आप की जरूरत है जोर दें कि कक्षा के वापसी मूल्य (उदाहरण उर्फ) पर सहेजा जाता है।

इस प्रयास करें:

mock_foobar_class.return_value.save = save_mock 

मुझे आशा है कि मदद करता है!

+2

आपने मुझे जवाब में हराया! – fuzzyman

+0

मेरी क्वेरी का जवाब देने के लिए उपरोक्त! आपका बहुत बहुत धन्यवाद! –

+0

@ मैथ्यू! आपका बहुत बहुत धन्यवाद! –

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