-
카테고리
-
세부 분야
백엔드
-
해결 여부
해결됨
test 코드 질문
24.01.14 23:23 작성 24.01.14 23:23 수정 조회수 142
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
신동현
지식공유자2024.01.14
안녕하세요. 그런 경우에는 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)
답변 1