2012-01-20 19 views
11

में काम नहीं कर रहा है, मैं एक विधि के भीतर से एक नकली वापस करने के लिए पैच का उपयोग करने की कोशिश कर रहा हूं। मूल संरचना निम्नानुसार है:मॉक पैच कक्षा के साथ __init__.py

MyCode.py 

class MyClass: 

    def __init__(self, first_name, last_name): 
     self.first = first_name 
     self.last = last_name 

    def get_greeting(self): 
     return 'Hello {f} {l}'.format(f=self.first, l=self.last) 


def get_new_greeting(first_name, last_name): 
    obj = MyClass(first_name, last_name) 
    return obj.get_greeting() 


my_code_test.py 

import unittest 
from mock import Mock, patch 
import my_code 

class TestMyCode(unittest.TestCase): 
    def setUp(self): 
     pass 

    @patch('my_code.MyClass') 
    def test_get_greeting(self, MockClass): 
     instance = MockClass.return_value 
     mock_greeting = 'Hello Me' 
     instance.get_greeting.return_value = mock_greeting 

     greeting = my_code.get_new_greeting('john', 'doe') 
     self.assertEqual(greeting, mock_greeting) 


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

उपरोक्त कोड मेरे लिए ठीक काम करता है। हालांकि, जब मैं वास्तविक कोड के लिए एक ही पैटर्न लागू करता हूं जिसे मैं परीक्षण करने की कोशिश कर रहा हूं, वास्तविक वस्तु (नकली नहीं) परीक्षण की विधि में वापस आती है। मुझे कोई मतभेद नहीं दिख रहा है। एकमात्र ऐसा लगता है कि थोड़ा अलग है कि वास्तविक वर्ग init .py फ़ाइल में परिभाषित किया गया है। मुझे यकीन नहीं है कि इससे कोई फर्क पड़ता है या नहीं? क्या इससे पहले कोई देखा है?

नोट: वास्तविक lib twilio 3.3.5 है और मैं अजगर 2.6.5 और Django 1.3.1 और 0.7.2 नकली

+1

आपको शायद उस कोड को पोस्ट करने की आवश्यकता है जो कोड नहीं है, जो कोड है। –

+0

@DanielRoseman बहुत मान्य बिंदु। इस दृष्टिकोण का उपयोग करने का कारण यह था कि मुझे लगता है कि बहुत कम लोगों के पास ट्विलियो पैकेज होगा और शायद इसे इंस्टॉल नहीं करना चाहते हैं (हालांकि वर्चुअलएन्व का उपयोग कर रहे हैं तो यह एक बड़ा सौदा नहीं है), और मैं यह दिखाना चाहता था कि मैं समझ गया मुझे जो करना है उसका बुनियादी सिद्धांत। आपके जवाब के लिए धन्यवाद। –

उत्तर

11

उपयोग कर रहा हूँ मैं यह पता लगा। __init__.py फ़ाइल के साथ इसका कोई लेना-देना नहीं था। यह (हमेशा के रूप में) मेरी गलती थी! :)

बस किसी को भी है कि हर भविष्य में Twilio और SMS से नकली और पैच का उपयोग करने की कोशिश कर के लिए

, यहाँ समाधान है:

मैं कक्षा twilio.rest.TwilioRestClient मजाक था लेकिन, चीजों को श्रृंखलित कर रहे हैं एक साथ और मुझे एसएमएस मैसेज नामक आंतरिक कक्षा पर पैच कॉल करने की आवश्यकता थी। तो, मेरी इकाई परीक्षण के लिए, यह अच्छी तरह से काम करता है:

@patch('twilio.rest.resources.SmsMessages') 
def test_send_msg_valid_args(self, MockClass): 
    instance = MockClass.return_value 
    instance.create.return_value = None 
    to_number = '+15555555555' 
    msg = 'Hello world' 
    send_sms(to_number, msg) 

    instance.create.assert_called_once_with(to=to_number, body=msg, from_=default_from_number) 

ध्यान दें: send_sms वास्तव में समारोह है कि मैं परीक्षण करने के लिए कोशिश कर रहा हूँ है। मैं बस यह सुनिश्चित करना चाहता था कि यह अपेक्षित रूप से twilio को कॉल कर रहा है और default_from_number की आपूर्ति कर रहा है। मान डिफ़ॉल्ट_from_number सेटिंग्स फ़ाइल में परिभाषित किया गया है और इस उदाहरण के लिए वास्तव में महत्वपूर्ण नहीं है।