Вы исправляете неизвестный объект get
в модуле request
. У вас, вероятно, нет такого модуля или объекта.
Вам необходимо обратиться к request
объекту в тестируемом модуле . Если get_data
живет в модуле views
, то вам нужно установить патч views.request.get
здесь:
@mock.patch('views.request.get', new=mock_response_200)
Из mock.patch()
документации :
target должен быть строкой в форме 'package.module.ClassName'
. Цель импортируется, а указанный объект заменяется новым, поэтому цель должна импортироваться из среды, из которой вы вызываете patch()
. Цель импортируется при выполнении декорированной функции, а не во время декорации.
Однако я бы не использовал здесь функцию . Просто дайте mock-патчу для вас метод get()
, затем настройте этот фиктивный объект. Конечно, вы можете передать это вспомогательной функции:
def config_response_200_mock(request_get):
response = request_get.return_value
response.status_code = 200
response.json.return_value = {
0: {'key1': 'value1', 'key2': 'value2'}
}
return response
@mock.patch('views.request.get')
def test_get_data(request_get):
response_mock = config_response_200_mock(request_get)
arg1 = 'arg1'
arg2 = None
arg3 = 'arg3'
stuff = get_data(arg1, arg2, arg3)
Вы также можете создать магический фиктивный объект в такой функции, а затем передать функцию в new_callable
on mock.patch()
:
def response_200_mock():
get_mock = mock.MagicMock()
response = get_mock.return_value
response.status_code = 200
response.json.return_value = {
0: {'key1': 'value1', 'key2': 'value2'}
}
return get_mock
@mock.patch('views.request.get', new_callable=response_200_mock)
def test_get_data(request_get):
arg1 = 'arg1'
arg2 = None
arg3 = 'arg3'
stuff = get_data(arg1, arg2, arg3)
В любом случае, объект, используемый для исправления request.get
, передается в test_get_data
в качестве аргумента.
Демонстрация любого из подходов (использование patch
в качестве менеджера контекста вместо декоратора, но принцип тот же:
>>> def config_response_200_mock(request_get):
... response = request_get.return_value
... response.status_code = 200
... response.json.return_value = {
... 0: {'key1': 'value1', 'key2': 'value2'}
... }
... return response
...
>>> with mock.patch('__main__.request.get') as request_get:
... response_mock = config_response_200_mock(request_get)
... arg1 = 'arg1'
... arg2 = None
... arg3 = 'arg3'
... stuff = get_data(arg1, arg2, arg3)
...
>>> stuff
'processed_response'
>>> response_mock.json()
{0: {'key1': 'value1', 'key2': 'value2'}}
>>> request_get.mock_calls
[call('some_url?arg1&arg3')]
>>> def response_200_mock():
... get_mock = mock.MagicMock()
... response = get_mock.return_value
... response.status_code = 200
... response.json.return_value = {
... 0: {'key1': 'value1', 'key2': 'value2'}
... }
... return get_mock
...
>>> with mock.patch('__main__.request.get', new_callable=response_200_mock) as request_get:
... arg1 = 'arg1'
... arg2 = None
... arg3 = 'arg3'
... stuff = get_data(arg1, arg2, arg3)
...
>>> stuff
'processed_response'
>>> request_get.return_value.json()
{0: {'key1': 'value1', 'key2': 'value2'}}
>>> request_get.mock_calls
[call('some_url?arg1&arg3')]