2012-08-31 13 views
5

मैं एक Django मॉडल है जो create विधि ओवरराइड करता है भी कुछ संबंधित वस्तुओं को बचाने के लिए के लिए एक ग्राहक प्रबंधक है:आप Django में एक संबंधित प्रबंधक विधि का नकल कैसे करते हैं?

class CustomManager(models.Manager): 
    def create(self, amount, user, description): 
     txn = self.get_query_set().create(user, description) 
     txn.budget_transactions.create(amount) 
     return txn 

मेरा प्रश्न है: मैं कैसे txn.budget_transactions.create करने के लिए कॉल नकली एक अपवाद को बढ़ाने के लिए करते हैं?

budget_transactionstxn ऑब्जेक्ट की विशेषता django.db.models.fields.related.RelatedManager का एक उदाहरण है। mock.patch का उपयोग इस कक्षा को नकल करने के लिए काम नहीं करता है क्योंकि इसे गतिशील रूप से घोषित किया जाता है - इसे सीधे आयात नहीं किया जा सकता है।

क्या कोई यह जानता है कि यह कैसे करें?

+0

क्या आप नकली पुस्तकालय का उपयोग कर रहे हैं? क्या आप पैच संदर्भ-प्रबंधक या सजावट का उपयोग करना चाहते हैं? – santiagobasulto

+0

मैक लाइब्रेरी का उपयोग करने में मुझे खुशी है अगर यह इस समस्या को हल कर सकता है। जैसा कि मैंने ऊपर बताया है, परंपरागत तरीके से 'mock.patch' का उपयोग करके संबंधित प्रबंधक वर्गों की गतिशील घोषणा के कारण काम नहीं करता है। – DavidWinterbottom

उत्तर

5

कारण यह है कि आप संबंधित मैनेजर को नकली ऑब्जेक्ट पर सेट नहीं कर सकते हैं क्योंकि django ने ऑब्जेक्ट पर विधि को ओवरराइड कर दिया है। इसलिए ऐसा लगता है कि नकली सही ढंग से सेट हो रही है क्योंकि कोई शिकायत नहीं है, यह वास्तव में budget_transactions को संबंधित प्रबंधक पर चुपचाप सेट कर रहा है। इसलिए यदि आपको वास्तव में एक नकली वापस करने की आवश्यकता है तो आपको को विधि प्राप्त करने की आवश्यकता होगी जो संबंधित प्रबंधक को लौटाता है और इसके बजाए एक मॉक ऑब्जेक्ट देता है।

तरह somthing lookig अंत चाहिए: कहा जा रहा है

@mock.patch('django.db.models.fields.related.ForeignRelatedObjectsDescriptor.__get__') 
def test_campaign_cancel(self, mock_manager): 
    mock_manager.return_value = mock.MagicMock() 
    mock_manager.return_value.create = Exception('Boom!') 

है कि इस दृष्टिकोण के लिए कई नुकसान देखते हैं यह एक कोर Django विधि अधिभावी हो जाएगा के बाद से और अब सभी RelatedManagers एक मज़ाक उड़ाया वस्तु वापस आ जाएगी। जो मैंने अनुभव किया है उससे अब तक अन्य विकल्पों का पता लगाना आसान है।

+0

मुझे 'django.db.models.fields.related.meverseManyRelatedObjectsDescriptor .__ set__' का मजाक करना था, लेकिन एक ही सामान्य दृष्टिकोण। – AlanSE

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