Python 2.7 - не могу понять, как проверить с макетом

Новое в использовании макета. на питоне 2.7.13.

я создаю оболочку вокруг этой библиотеки
https://github.com/sendgrid/sendgrid-python/blob/master/sendgrid/sendgrid.py

которая в свою очередь использует эту библиотеку для любых вызовов REST
https://github.com/sendgrid/python-http-client/blob/master/python_http_client/client.py

Мой тестовый код выглядит

class TestSendgridUtils(unittest.TestCase):
    def setUp(self):
        self.sgsu = SubUser(api_key=RANDOM_API_KEY, hippo_user=RANDOM_USER_OBJ)

    @patch('sendgrid.SendGridAPIClient')
    @patch('python_http_client.Client')
    def test_create(self, sgc_mock, http_client_mock):
        self.sgsu.create()
        expected_data = {
            'email' : self.sgsu.sg_username
        }
        print http_client_mock.call_list()
        sgc_mock.client.assert_called_with(request_body=expected_data)

Я в основном пытаюсь издеваться над базовой библиотекой, которая делает HTTP-вызовы. Мои тесты просто для того, чтобы убедиться, что я передаю правильные параметры в модуль sendgrid.

Прямо сейчас, если я запускаю тесты, HTTP-запросы все еще делаются, что означает, что я не успешно насмехаюсь над предполагаемыми библиотеками.

Читая ложную документацию, я понимаю, что патч работает только тогда, когда я создаю экземпляр базового класса. Но это должно быть в setUp(), что означало бы, что мои макеты не будут доступны в моих тестовых примерах?

В результате я не могу понять, как лучше всего использовать макет в этом случае. Я также не могу понять, могу ли я просто посмеяться над 'sendgrid.SendGridAPIClient' или мне нужно надрать 'python_http_client.Client'

1 ответ

Вам следует patch объекты в модуле, где вы их используете (например, в app.py), а не там, где они определены.
Так что ваши звонки patch должен выглядеть так:

@patch('app.sendgrid.SendGridAPIClient')

не:

@patch('sendgrid.SendGridAPIClient')

Также ваш заказ макетов не соответствует:

@patch('sendgrid.SendGridAPIClient')
@patch('python_http_client.Client')
def test_create(self, sgc_mock, http_client_mock):

Вы должны либо переключить вызовы на patch или переключите аргументы метода, потому что теперь @patch('sendgrid.SendGridAPIClient') соответствует http_client_mock а также @patch('python_http_client.Client') в sgc_mock,

Другие вопросы по тегам