@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가 첫 번째 인자
...
@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됨
# 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)
이 mock 함수가 정확히 한 번 호출됐냐? 검사
로직 안에서 조건 분기에 따라 특정 함수가 안 불리거나, 정확히 한 번만 불리는 걸 보장해야 할 때.
필요한 경우
로직에서 특정 파라미터로 정확하게 함수 호출했는지 확인하고 싶을 때
특히 “값에 따라 다르게 동작”하는 로직에서는 매우 유용
@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