@patch
가져온 모듈에서 함수를 사용하는 방법을 이해하고 싶습니다 .
이것은 내가 지금까지있는 곳이다.
app / 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()
app / my_module / __ init__.py :
def get_user_name():
return "Unmocked User"
test / 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
. 테스트중인 네임 스페이스로 가져 오는 다른 패키지의 메서드를 어떻게 모의합니까?
답변
패키지 에서 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')
표준 라이브러리 문서에는 이를 설명 하는 유용한 섹션 이 포함되어 있습니다.
답변
Matti John의 답변이 귀하의 문제를 해결하고 저도 도왔습니다. 감사합니다! 그러나 원래 ‘get_user_name’함수를 조롱 된 함수로 현지화하는 것이 좋습니다. 이렇게하면 함수가 교체되는시기와 교체되지 않는시기를 제어 할 수 있습니다. 또한 동일한 테스트에서 여러 번 교체 할 수 있습니다. 이렇게하려면 ‘with’구문을 매우 유사한 방식으로 사용하십시오.
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')