instance Mock method 모킹

최대 1 분 소요

객체 method 모킹하기

찾아보거나 알게된 배경

테스트 작성하다가 알게되었다.


요약

아래처럼 instance에 대해 mock으로 만들고, 테스트 인라인에서 method를 patch해주려면 아래처럼 해야한다.


내용

  • split_temp.py
    
    class OriginAny:
      def running(self):
        return "origin_run!"
    
    class CallingAny:
      def work(self):
        org = OriginAny()
        return org.running()
    
  • test.py
    class AnyMock(MagicMock):
      def __init__(self, *args: any, **kw: any):
        super().__init__(*args, **kw)
        self.mock_add_spec(spec=OriginAny)
    
    class TestCallingAny_work_메서드_호출시:
      @patch("split_temp.OriginAny", new_callable=AnyMock)
      def test_any(self, mock_origin_any: AnyMock):
        instance = mock_origin_any.return_value
        instance.running.return_value = "mock_run!"
        calling_any = CallingAny()
        result = calling_any.work()
    
        assert mock_origin_any.mock_calls == [call(), call().running()]
        assert result == "mock_run!"