해결된 질문
작성
·
105
0
def test_update_todo(client, mocker):
# 200
# mocker.patch(
# "main.get_todo_by_todo_id",
# return_value=ToDo(id=1, contents="todo", is_done=True)
# )
# undone = mocker.patch.object(ToDo, "undone")
# mocker.patch(
# "main.update_todo",
# return_value=ToDo(id=1, contents="todo", is_done=False)
# )
#
# response = client.patch("/todos/1", json={"is_done": False})
# undone.assert_called_once_with()
#
# assert response.status_code == 200
# assert response.json() == {"id": 1, "contents": "todo", "is_done": True}
# 가상 DB 생성
mocker.patch(
"main.get_todo_by_todo_id",
return_value=None
)
# 404
# update
response = client.patch("/todos/1", json={"is_done": True})
assert response.status_code == 404
assert response.json() == {"detail": "ToDo Not Found"}
여기에서 422 에러가 매칭 안된다고 나옵니다.
main.py 코드는
@app.patch("/todos/{todo_id}", status_code=200)
def update_todo_handler(
todo_id: int,
is_done: bool,
session: Session = Depends(get_db)
):
todo: ToDo | None = get_todo_by_todo_id(session=session, todo_id=todo_id)
if todo:
todo.done() if is_done else todo.undone()
todo: ToDo = update_todo(session=session, todo=todo)
return ToDoSchema.from_orm(todo)
return HTTPException(status_code=404, detail="ToDo Not Found") 이러합니다. 똑같이 한상태이고 혹시 스키마 부분이 from_attributes = True 이걸 써서 그런겉가요?
답변 1
0
안녕하세요! handler 쪽 코드에서 request body를 처리하는 부분이 누락되어 있네요.
아래와 같이 수정 부탁드립니다.
is_done: bool = Body(..., embed=True)
질문 주신 의도를 제가 정확히 이해한건지 헷갈리는데요.
response.status_code == 400
코드는 response 객체의 status_code 속성을 검증하는 것입니다.
response.json()
은 response 객체의 json() 메소드를 호출하여 JSON 응답 결과를 python dict 변환하여 출력하는 함수입니다. respons.json()에 반환되는 dict 값 에는 status_code가 포함되어 있지 않습니다.
감사합니다. 또한가지 강의 에는 response.status_code == 404 로 코딩되어있는데 print(response.json())를 해본결과 json 형태로 들어와서 매칭이 안되던데 response.json()['status_code']== 404 이렇게 해도 무방한겁니까? 그이유가 버전이 업그레이드 되면서 형식이 바뀐겁니까?