inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! FastAPI 입문

SQL JOIN

test 코드 질문

해결된 질문

283

한건우

작성한 질문수 3

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 코드를 바꾼다면 어떻게 바꿔야할까요?

python 리팩토링 orm FastAPI pytest

답변 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)


 

1

한건우

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

0

한건우

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

FasAPI Swagger UI에서 단일조회 todo_id 를 사용했는데, 입력값에 1을 넣으니 오류가 뜹니다 ㅠ

0

87

2

DB 질문

0

81

2

Post API 강의 질문

0

55

2

post 작성 오류

0

107

3

uvicorn 종료 문제

0

436

2

왜 return타입이 ToDo라는 스트링인가요?

0

130

2

ORM 연관관계

0

109

2

Oracle DB 연결과 관련해 질문이 있습니다..

0

153

2

섹션 2, 3의 PATCH API의 차이점

0

132

1

ORM 테이블 생성

0

119

1

테스트 코드 오류

0

177

1

orm relationship 정의 중 해당 에러 발생 시 어떻게 고쳐야 하는걸까요

0

214

3

FastAPI 폴더 구조에 대해 질문이 있습니다.

0

412

2

질문 있습니다.

0

161

2

ORM 개념

0

133

1

mysql root 비밀번호 변경관련

0

296

2

[질문] patch API

0

151

3

디자인 패턴

0

128

1

main.py 리로드문제

0

235

2

인터프리터 오류

0

286

4

로그 저장에 대한 질문입니다.

0

100

1

Internal Server Error

0

240

2

PATCH API - 수정

0

199

2

파이참 임포트 문제

0

263

1