Mock

Haks.·6일 전
0

Study

목록 보기
65/65

Mock

patch(target, new_callable = AsyncMock)

  • 여러개 사용 가능
  • 순서 중요 마지막 patch 가 첫번째 인자임 아래에서 위로
@patch("app.repo.get_user", new_callable=AsyncMock)
@patch("app.repo.get_post", new_callable=AsyncMock)
async def test_service(mock_get_post, mock_get_user):  # 마지막 patch가 첫 번째 인자
    ...

.return_value

  • mock 함수가 await 되었을 때 리턴해줄 값
  • 즉 대체한 함수가 결과값을 어떤 것을 줄지 내가 결정하는 것이다
@patch("app.repo.get_user", new_callable=AsyncMock)
async def test_service(mock_get_user):
    mock_get_user.return_value = User(id=1, name="테스트")
    result = await get_user()  # 이 get_user는 실제 DB 안 타고 mock됨

.side_effect

  • 특정 값을 돌려주고싶다 -> 가능 (리스트로도 가능)
  • 호출 시 에러 던지고 싶다 -> 가능 (return_value 는 객체를 주는거지 실제 raise 처럼 동작을 안함)
  • 여러번 호출시 다른값 -> 리스트 형태 가능
# 1. 예외 발생 (주로 try/except 처리 테스트 시)
mock_get_user.side_effect = Exception("DB 에러")

# 2. 여러 값 순차 리턴
mock_get_user.side_effect = [User(id=1), User(id=2), User(id=3)]

# 3. 일반 return_value 처럼 사용할 떄
mock_get_user.side_effect = lambda: User(id=1)
  • side_effect는 다음 중 하나여야 함:
    1. 예외 객체 → side_effect = ValueError("에러") → raise ValueError(...)처럼 작동
    2. 함수 or lambda → side_effect = lambda: User(id=1) → 직접 실행 후 결과 리턴
    3. iterable (list 등) → side_effect = [User(id=1), User(id=2)] → 순서대로 리턴

assert_called_once()

이 mock 함수가 정확히 한 번 호출됐냐? 검사
로직 안에서 조건 분기에 따라 특정 함수가 안 불리거나, 정확히 한 번만 불리는 걸 보장해야 할 때.

assert_called_with(...)

필요한 경우
로직에서 특정 파라미터로 정확하게 함수 호출했는지 확인하고 싶을 때
특히 “값에 따라 다르게 동작”하는 로직에서는 매우 유용

예시

@pytest.mark.asyncio
@patch("app.domain.free_board.services.create_free_board_by_id", new_callable=AsyncMock)
async def test_create_free_board_by_id_service(mock_create):
    # given
    dummy_user = object()
    dummy_data = AsyncMock()
    dummy_result = FreeBoardResponseDTO(
        id=1,
        user=UserSchema(
            id=1
        ),
        title="test title",
        content="test content",
        image_url=None,
        view_count=1,
        created_at="2025-04-23T12:00:00",
        updated_at="2025-04-23T12:00:00",
    )
    mock_create.return_value = dummy_result # 여기서 create_free_board_by_id 이 함수 호출시 값을 지정해줌

    # when
    result = await create_free_board_by_id_service(dummy_data, dummy_user)

    # then
    mock_create.assert_called_once_with(dummy_data, dummy_user) # 그래서 서비스 로직을 잘 작성 하였으면 return 값이 안에서 호출한 저값에대한 mock 데이터 값이 나옴
    assert result == dummy_result

0개의 댓글

관련 채용 정보