2012-01-20 2 views
11

Я пытаюсь использовать патч, чтобы вернуть Mock из метода. Базовая структура выглядит следующим образом:Mock patch не работает с классом в __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 и я использую Python 2.6.5 и Django 1.3.1 и 0.7.2 Пробный

+1

Возможно, вам потребуется опубликовать код, который не работает, а не код. –

+0

@ DanielRoseman очень действительный пункт. Причина, по которой я использовал этот подход, заключалась в том, что я решил, что очень немногие люди будут иметь пакет twilio и, возможно, не захотят его устанавливать (хотя это не очень важно, если вы используете virtualenv), и я хотел показать, что я понял основной принцип того, что мне нужно было сделать. Спасибо за ваш ответ. –

ответ

11

Я понял это. Это не имело никакого отношения к файлу __init__.py. Это было (как обычно) моя вина! :)

Только для тех, кто является каждый пытается использовать Mock и патч с Twilio и SMS в будущем, вот решение:

Я Дразнящий класс twilio.rest.TwilioRestClient Но, все прикованы вместе, и мне нужно было назвать patch во внутреннем классе SmsMessage. Итак, для моего модульного теста это хорошо работает:

@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. Значение default_from_number определено в файле настроек и не очень важно для этого примера.

Смежные вопросы