해결된 질문
작성
·
486
0
def test_update_todo(client, mocker):
'''
특정 객체 update 테스트
# 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),
)
# API 호출 여부
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": False} # 성공
# Resetting the mock before the next scenario
# 404
mocker.patch(
"main.get_todo_by_todo_id",
return_value=None,
)
response = client.patch("/todos/1", json={"is_done": True})
assert response.status_code == 404
assert response.json() == {"detail": "ToDo Not Found"}
pytest 시 아래와 같은 에러가 발생합니다. 강사님 코드와 상이한 부분도 없고 로직도 맞게 작성한 것 같은데 undone이 한번도 호출이 되지 않았다고 합니다.
During handling of the above exception, another exception occurred:
client = <starlette.testclient.TestClient object at 0xffff89948640>, mocker = <pytest_mock.plugin.MockerFixture object at 0xffff89004e50>
def test_update_todo(client, mocker):
'''
특정 객체 update 테스트
# 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")
> print(undone.assert_called_once_with())
E AssertionError: Expected 'undone' to be called once. Called 0 times.
tests/test_main.py:106: AssertionError
========================================================== short test summary info ==========================================================
FAILED tests/test_main.py::test_update_todo - AssertionError: Expected 'undone' to be called once. Called 0 times.
======================================================== 1 failed, 5 passed in 0.18s ========================================================
#
답변 1
0
보통 mocking을 이용한 테스트에서 자주 발생하는 실수는 mocking 하는 메소드 이름에 오타가 있는 경우가 있습니다. 예를 들어, abc 메소드를 mocking 해야 되는데 ab로 mocking 하는 경우입니다. 다만 첨부해주신 코드상 오타가 있어 보이진 않는데요.
이런 경우에는 코드를 한 줄씩 보면서 개별 코드가 잘 동작하는지 디버깅을 해봐야 할 것 같습니다.
먼저 handler 코드의 if todo
분기문이 잘 동작하는지 그래서 분기문 아래의 코드가 잘 실행되는지 확인해야 할 것 같습니다.
현재 코드에서 if todo
분기문이 잘 동작한다면 응답의 상태 코드가 200을 리턴해야 합니다. 테스트 코드에서 undone.assert_called_once_with()
부분을 주석 처리하고 테스트 코드를 동작했을 때 어떻게 결과가 출력되는지 확인 부탁드립니다.
핸들러 함수입니다!