Mock patch не работает с классом в __init__.py
Я пытаюсь использовать patch для возврата Mock из метода. Базовая структура выглядит следующим образом:
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 и Mock 0.7.2
Ответы
Ответ 1
Я понял это. Это не имело никакого отношения к файлу __init__.py
. Это было (как обычно) моя вина!:)
Просто для тех, кто каждый пытается использовать Mock и патч с Twilio и SMS в будущем, вот решение:
Я издевался над классом twilio.rest.TwilioRestClient. Но все вещи связаны друг с другом, и мне нужно было назвать патч во внутреннем классе SmsMessage. Итак, для моего unit test это хорошо работает:
@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)
note: send_sms - это действительно функция, которую я пытаюсь проверить. Я просто хотел удостовериться, что он вызвал twilio, как ожидалось, и предоставил default_from_number. Значение default_from_number определено в файле настроек и не очень важно для этого примера.