728x90
반응형
현상
python에서 test를 하는데 @patch가 작동을 안했다.
아래 코드에서 make_something 함수는 테스트 대상이 아니라서 테스트 도중에 실행되지 않도록 @patch를 적용했는데 정상 작동하지 않고 make_something 함수가 그대로 실행되었다.
from a.util import make_something
# 중략
@patch("a.util.make_something")
def test_make_other_thing(self, mock_make_something):
# ...
mock_make_something.assert_not_called() # Error
원인
mock은 특정 object의 참조를 가짜 객체로 바꾼다. 그런데 최상단에서 import를 해버리면 실제 그 class나 function 등 object를 직접 참조하기 때문에 이후 test 코드 실행부의 @patch에서 참조를 바꿔줄 수 없다.
ref) https://docs.python.org/3/library/unittest.mock.html#where-to-patch
해결 방법
1. local import를 한다.
@patch("a.util.make_something")
def test_make_other_thing(self, mock_make_something):
from a.util import make_something
# ...
mock_make_something.assert_not_called() # Error
2. 실제 객체의 path를 참조하는 것이 아니라, 해당 객체를 불러오는 곳의 path를 참조하여 @patch한다.
from a.util import make_something
@patch("b.where.make_other_thing.function.called.make_something")
def test_make_other_thing(self, mock_make_something):
# ...
mock_make_something.assert_not_called() # Error
이 경우는 다시 말해 b/where/make_other_thing/function/called.py 디렉토리에서
from a.util import make_something을 선언하고 있다고 가정해보면,
@patch 문에서 b.where...make_something을 입력해서 해당 called.py 파일이 실행되면서 import 되기전에 @patch를 적용한다는 것이다.
728x90
반응형
'Programming-[Backend] > Python' 카테고리의 다른 글
[TIL] Deepcopy, dict 순서 유지 (0) | 2023.08.16 |
---|---|
[TIL] python csv writer StringIO, BytesIO for AWS boto3 (0) | 2023.06.13 |
[링크] 파이썬 assert, raise 차이 (0) | 2023.03.02 |
웹 스크래핑, 크롤링- 2. Selenium (0) | 2023.03.01 |
[링크] 파이썬 가상환경 venv, Pycharm (0) | 2023.02.27 |