테스트 작성시, 모킹된 함수의 입력된 값 확인하기
입력값을 체크하는 방법
찾아보거나 알게된 배경
테스트시, 입력한 함수나 메서드가 MagicMock으로 모킹해놓으면, 에러가 발생했다.
따라서, 멀티프로세스 동작을 위해 작성해놓은 함수에서 넘겨받는 args를 검사하기 위해 찾아봤다.
요약
아래처럼, call에서 args/kwargs를 가져오고 해당 args/kwargs값을 가지고 비교하여 테스트하면 된다.
class UseClass:
def __init__(self, name: str):
self.name = name
@staticmethod
def _inter_static_hello(name: str, names: list[str]) -> str:
return f'{name} hello! {names}'
def hello_with_static(self) -> str:
return self._inter_static_hello(self.name, [self.name, self.name + '1', self.name + '2'])
@patch('main.UseClass._inter_static_hello')
def test_mock_called_with_mock(self, mock_inter_static_hello: MagicMock):
mock_inter_static_hello.side_effect = lambda name, names: f'{name} hello {names}'
expect_data = [['AA', 'AA1', 'AA2'], ['BB', 'BB1', 'BB2']]
use_cls = UseClass('AA')
use_cls.hello_with_static()
use_cls2 = UseClass('BB')
use_cls2.hello_with_static()
all_calls = mock_inter_static_hello.call_args_list
print(f'all calls? {all_calls}')
i = 0
for calls in all_calls:
print(f'[{i}] call_args_list ? {calls}')
# mock.assert_called_with가 호출됐을때
# 내부적으로 이런식으로 확인하도록 구현되어있다.
# 코드 확인하기
# - python3.9 mock.py line 849
# - mock.assert_called_with -> self._call_matcher -> if
args, kwargs = calls
print(f'[{i}] calls to args? {args} kwargs? {kwargs}')
second_of_args = args[1]
print(f'[{i}] second_of_args? {second_of_args}')
self.assertEqual(second_of_args, expect_data[i])
i = i + 1
all calls? [call('AA', ['AA', 'AA1', 'AA2']), call('BB', ['BB', 'BB1', 'BB2'])]
[0] call_args_list ? call('AA', ['AA', 'AA1', 'AA2'])
[0] calls to args? ('AA', ['AA', 'AA1', 'AA2']) kwargs? {}
[0] second_of_args? ['AA', 'AA1', 'AA2']
[1] call_args_list ? call('BB', ['BB', 'BB1', 'BB2'])
[1] calls to args? ('BB', ['BB', 'BB1', 'BB2']) kwargs? {}
[1] second_of_args? ['BB', 'BB1', 'BB2']
ps. 버드뷰에서 TYL 이라는 것을 했을 때, 다른 팀원이 선정해줬었음.