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
,