Ложный патч не работает с классом в __init__.py - PullRequest
12 голосов
/ 21 января 2012

Я пытаюсь использовать 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. Я не уверен, если это имеет значение или нет? Кто-нибудь видел это раньше?

Примечание: фактическая библиотека - это twilio 3.3.5, и я использую Python 2.6.5 и Django 1.3.1 и Mock 0.7.2

1 Ответ

11 голосов
/ 21 января 2012

Я понял это.Это не имеет ничего общего с __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 определено в файле настроек и не очень важно для этого примера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...