[python] 가져온 모듈에서 함수를 조롱하는 파이썬

@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.mockapp.my_module.get_user_nameapp.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')


답변