인프런 커뮤니티 질문&답변

한건우님의 프로필 이미지
한건우

작성한 질문수

실전! FastAPI 입문

SQL JOIN

test 코드 질문

해결된 질문

작성

·

233

·

수정됨

0

강의 너무 잘보고 있습니다

test 코드 실습 중에 생긴 문제인데요

def test_update_todo(client, mocker):
    mocker.patch.object(ToDoRepository, "get_todo_by_todo_id", return_value=ToDo(id=1, contents="todo", is_done=True))
    mocker.patch.object(ToDoRepository, "update_todo", return_value=ToDo(id=1, contents="todo", is_done=True))

    body = {
        "is_done": False
    }

    response = client.patch("/todos/1", json=body)

    assert response.status_code == 200
    assert response.json() == {"id": 1, "contents": "todo", "is_done": True}

    # 404
    mocker.patch.object(ToDoRepository, "get_todo_by_todo_id", return_value=None)

    response = client.patch("/todos/1", json=body)

    assert response.status_code == 404
    assert response.json() == {"detail": "ToDo Not Found"}

이런식으로 test 코드를 작성한 다음에 리팩토링 과정에서 잘못선택되서 todo_id가 빠진 상태로 코드를 올렸습니다

@router.patch("/{todo_id}", status_code=200)
def update_todo_handler(
        todo_id: int,
        is_done: bool = Body(..., embed=True),
        todo_repo: ToDoRepository = Depends()):
    todo: ToDo | None = todo_repo.get_todo_by_todo_id() # 이 부분 todo_id를 빼버림

    if todo:
        todo.done() if is_done else todo.undone() 
        todo: ToDo = todo_repo.update_todo(todo)
        return ToDoSchema.from_orm(todo)
    else:
        raise HTTPException(status_code=404, detail="ToDo Not Found")

이게 제가 잘못 작성한 코드고 todo.get_todo_by_todo_id 함수에 parameter를 안넣고 pytest를 실행해도 mocker.patch로 지정된 값이 넘어오게 되니까 에러가 나지 않더라구요

 

실행하면 당연히 500 internal error가 발생하는데 혹시 이런 경우까지 방지하도록 test 코드를 바꾼다면 어떻게 바꿔야할까요?

답변 1

1

신동현님의 프로필 이미지
신동현
지식공유자

안녕하세요. 그런 경우에는 mocker의 assert_called_once_with를 사용하시면 해당 메소드가 올바른 인자로 호출되었는지 확인할 수 있습니다.

# 기존 사용하시던 부분에 mock을 변수로 할당
mock_get_todo_by_todo_id = mocker.patch.object(ToDoRepository, "get_todo_by_todo_id", return_value=None)

# client.patch() 호출 이후
mock_get_todo_by_todo_id.assert_called_once_with(todo_id=todo_id)


 

한건우님의 프로필 이미지
한건우
질문자

늦은 시간에 빠르고 명쾌한 해답 감사합니다! 좋은 한 주 되세요!

한건우님의 프로필 이미지
한건우
질문자

아 ^^; 강의 후반부에 나오는군요

한건우님의 프로필 이미지
한건우

작성한 질문수

질문하기