【问题标题】:Test with FastAPI TestClient returns 422 status code使用 FastAPI TestClient 进行测试返回 422 状态码
【发布时间】:2020-12-30 10:06:47
【问题描述】:

我尝试使用来自 FastAPI(基本上是 Scarlett TestClient)的 TestClient 测试端点。

响应代码始终为 422 Unprocessable Entity。

这是我当前的代码:

from typing import Dict, Optional

from fastapi import APIRouter
from pydantic import BaseModel

router = APIRouter()


class CreateRequest(BaseModel):
    number: int
    ttl: Optional[float] = None


@router.post("/create")
async def create_users(body: CreateRequest) -> Dict:
    return {
        "msg": f"{body.number} Users are created"
    }

如您所见,我还将application/json 标头传递给客户端以避免潜在错误。

这是我的测试:

from fastapi.testclient import TestClient
from metusa import app


def test_create_50_users():
    client = TestClient(app)
    client.headers["Content-Type"] = "application/json"

    body = {
        "number": 50,
        "ttl": 2.0
    }
    response = client.post('/v1/users/create', data=body)

    assert response.status_code == 200
    assert response.json() == {"msg": "50 Users created"}

我也在响应对象中发现了这个错误信息

b'{"detail":[{"loc":["body",0],"msg":"Expecting value: line 1 column 1 (char 0)","type":"value_error.jsondecode","ctx":{"msg":"Expecting value","doc":"number=50&ttl=2.0","pos":0,"lineno":1,"colno":1}}]}'

感谢您的支持和时间!

【问题讨论】:

    标签: python fastapi


    【解决方案1】:

    您无需手动设置标题。您可以在 client.post 方法中使用 json 参数而不是 data

    def test_create_50_users():
        client = TestClient(router)
    
        body = {
            "number": 50,
            "ttl": 2.0
        }
        response = client.post('/create', json=body)
    

    如果你还想使用data属性,你需要使用json.dumps

    def test_create_50_users():
        client = TestClient(router)
        client.headers["Content-Type"] = "application/json"
    
        body = {
            "number": 50,
            "ttl": 2.0
        }
        response = client.post('/create', data=json.dumps(body))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 2012-11-09
      • 2021-04-19
      • 2018-10-12
      • 1970-01-01
      相关资源
      最近更新 更多