해결된 질문
작성
·
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)
늦은 시간에 빠르고 명쾌한 해답 감사합니다! 좋은 한 주 되세요!