테스트 작성시, 모킹된 함수의 입력된 값 확인하기

1 분 소요

입력값을 체크하는 방법

찾아보거나 알게된 배경

테스트시, 입력한 함수나 메서드가 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 이라는 것을 했을 때, 다른 팀원이 선정해줬었음.