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

연구개발팀님의 프로필 이미지

작성한 질문수

실전! FastAPI 입문

(실습) 테스트 코드 - PATCH API

테스트 코드 path api 에서 오류에대해 해결해주세요

24.07.17 10:25 작성

·

72

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

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

2024. 07. 17. 11:07

안녕하세요! handler 쪽 코드에서 request body를 처리하는 부분이 누락되어 있네요.

아래와 같이 수정 부탁드립니다.

is_done: bool = Body(..., embed=True)

연구개발팀님의 프로필 이미지

2024. 07. 17. 11:17

감사합니다. 또한가지 강의 에는 response.status_code == 404 로 코딩되어있는데 print(response.json())를 해본결과 json 형태로 들어와서 매칭이 안되던데 response.json()['status_code']== 404 이렇게 해도 무방한겁니까? 그이유가 버전이 업그레이드 되면서 형식이 바뀐겁니까?

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

2024. 07. 17. 11:23

질문 주신 의도를 제가 정확히 이해한건지 헷갈리는데요.

response.status_code == 400 코드는 response 객체의 status_code 속성을 검증하는 것입니다.

response.json()은 response 객체의 json() 메소드를 호출하여 JSON 응답 결과를 python dict 변환하여 출력하는 함수입니다. respons.json()에 반환되는 dict 값 에는 status_code가 포함되어 있지 않습니다.