Python Смещение функции из импортированного модуля
Я хочу понять, как @patch
функция из импортированного модуля.
Вот где я до сих пор.
приложение /mocking.py:
from app.my_module import get_user_name
def test_method():
return get_user_name()
if __name__ == "__main__":
print "Starting Program..."
test_method()
приложение /my _module/__ __ INIT ру:.
def get_user_name():
return "Unmocked User"
тест /mock -test.py:
import unittest
from app.mocking import test_method
def mock_get_user():
return "Mocked This Silly"
@patch('app.my_module.get_user_name')
class MockingTestTestCase(unittest.TestCase):
def test_mock_stubs(self, mock_method):
mock_method.return_value = 'Mocked This Silly')
ret = test_method()
self.assertEqual(ret, 'Mocked This Silly')
if __name__ == '__main__':
unittest.main()
Это работает не, как я ожидал. Модуль "исправленный" просто возвращает нефиксированное значение get_user_name
. Как мне высмеять методы из других пакетов, которые я импортирую в тестируемое пространство имен?
Ответы
Ответ 1
Когда вы используете декоратор patch
из пакета unittest.mock
, вы не исправляете пространство имен, из которого импортируется модуль (в данном случае app.my_module.get_user_name
), вы его исправляете в пространство имен под тестом app.mocking.get_user_name
.
Чтобы сделать выше с помощью Mock
, попробуйте что-то вроде ниже:
from mock import patch
from app.mocking import test_method
class MockingTestTestCase(unittest.TestCase):
@patch('app.mocking.get_user_name')
def test_mock_stubs(self, test_patch):
test_patch.return_value = 'Mocked This Silly'
ret = test_method()
self.assertEqual(ret, 'Mocked This Silly')
В стандартную библиотечную документацию входит полезный описывающий это.
Ответ 2
В то время как Матти Джон ответ решает вашу проблему (и тоже помог мне, спасибо!), я бы предложил локализовать замену оригинальной функции get_user_name с насмешкой. Это позволит вам контролировать, когда функция будет заменена, а когда нет. Кроме того, это позволит вам сделать несколько замен в одном и том же тесте. Чтобы сделать это, используйте выражение "с" в симпатичной форме:
from mock import patch
class MockingTestTestCase(unittest.TestCase):
def test_mock_stubs(self):
with patch('app.mocking.get_user_name', return_value = 'Mocked This Silly'):
ret = test_method()
self.assertEqual(ret, 'Mocked This Silly')