status_code от pytest не равен реальному - PullRequest
0 голосов
/ 11 апреля 2020

Вот веб-приложение fastapi. У меня возникли проблемы с тестом.

post в crud.py :

async def post(payload: BookSchema):
    query = books.insert().values(book=payload.book, author=payload.author,
                                  create_time=payload.create_time, update_time=payload.update_time)
    return await database.execute(query=query)

create_book:

@router.post("/book", response_model=BookDB, status_code=201)
async def create_book(payload: BookSchema):
    book_id = await crud.post(payload)

    response_object = {
        "id": book_id,
        **payload.dict()
    }
    return response_object

conftest.py :

import pytest
from starlette.testclient import TestClient
from app.main import app


@pytest.fixture()
def test_app():
    with TestClient(app) as client:
        yield client

Я использую pytest для проверки своего случая:

def test_create_book_invalid_json(test_app):
    response = test_app.post(API_PREFIX + "/book", data=json.dumps({"book": "smart"}))
    print(f"response.status_code is {response.status_code}")
    assert response.status_code == 422

Ожидаемый код_состояния должен быть 422, и я получил 201. Я пытаюсь напечатать response.status_code, и вывод будет 422.

test_books.py::test_create_book_invalid_json FAILED                      [100%]response.status_code is 422

test_books.py:20 (test_create_book_invalid_json)
201 != 422

Expected :422
Actual   :201

1 Ответ

0 голосов
/ 11 апреля 2020

Вы не предоставили информацию о своем тестовом клиенте здесь, но я предполагаю, что он похож на requests. В таком случае параметр data ожидает словарь, а не строку.

response = test_app.post(url, data={'book': 'smart'})

Это отправит соответствующие данные формы в ваше веб-приложение. Если вам нужно отправить JSON, используйте параметр json вместо:

response = test_app.post(url, json={'book': 'smart'})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...