2013-10-30 7 views
6

मैं अजगर है जो http अनुरोध करता में एक कस्टम एपीआई का परीक्षण कर रहा हूँ के रूप में कार्य करने के लिए अजगर नकली side_effect का उपयोग कैसे करें, लेकिन मैं हर बार जब मैं चलाने के असली बाहरी प्रणाली के लिए एक अनुरोध बनाने के लिए नहीं करना चाहते हैं इकाई परीक्षण। मैं एक side_effect कार्य करने के लिए गतिशील रूप से नकली एपीआई प्रतिक्रिया के साथ अजगर का नकली लाइब्रेरी का उपयोग कर रहा हूँ। क्लास विधि की तरह व्यवहार करने के लिए मैं पक्ष_फैक्ट विधि कैसे प्राप्त करूं?इकाई परीक्षण में एक कक्षा विधि

import requests 

class MyApiClass(): 
    def make_request(self, params): 
     return requests.get('http://someurl.com', params=params) 

    def create_an_object(self, params): 
     return self.make_request(params) 

import unittest, mock 

def side_effect_func(self, params): 
    if params['name'] == 'Specific Name': 
     return {'text': 'Specific Action'} 
    else: 
     return {'text': 'General Action'} 

class MyApiTest(unittest.TestCase): 
    def setUp(self): 
     super(MyApiTest, self).setUp() 
     mocked_method = mock.Mock(side_effect=side_effect_func) 
     MyApiClass.make_request = mocked_method 

    def test_create_object(self): 
     api = MyApiClass() 
     params = {'name': 'Specific Name'} 
     r = api.create_an_object(params) # Complains that two arguments are needed! 
     self.assertEqual(r['text'], 'Specific Action') 

मैं यह त्रुटि

TypeError: side_effect_func() takes exactly 2 arguments (1 given) 

मिल लेकिन मैं side_effect_func चाहते api पहले तर्क के रूप में पारित करने के लिए। किसी भी मदद की सराहना करें!

उत्तर

4

सबसे आसान तरीका शायद आपकी नकली विधि को एक ही तर्क लेने के लिए होगा, फिर MyApiClass संदर्भित रूप से नकली विधि के भीतर संदर्भित करें। अन्यथा, आप वर्ग वस्तु ही (मूल रूप से एक नकली metaclass बनाने) या शायद एक कारखाने कि partial का इस्तेमाल करता है मक्खी पर एक नकली वर्ग विधि का निर्माण करने का उपयोग कर मजाक की कोशिश कर सकते। लेकिन अगर एक तर्क/स्थिर संदर्भ विधि आपके लिए काम करेगा, जो मेरे लिए सबसे अच्छा लगता है।

इसके अलावा, नकली डॉक्स से, वहाँ mocking an unbound method using patch जो लगता है कि इसे और अधिक तुम क्या जरूरत है हो सकता है है,।

+1

हाँ, धन्यवाद! मुझे लगता है कि पैच के साथ एक अनबाउंड विधि का मज़ाक करना मुझे चाहिए। यदि नहीं, तो MyApiClass को हार्डकोडिंग के आपके सुझाव को काम करना चाहिए। – conman

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