본문 바로가기
관리자

Programming-[Backend]/Python

[TIL] python @patch doesn't work, @patch 작동 안함. mock

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
반응형