fastAPI 一些测试 return 404 |测试

fastAPI some tests return 404 | pytest

我目前正在尝试为我的 fastAPI 程序编写一些单元测试。 但问题是,有些测试 return 出现 {"detail": "Not found"} 错误,而其他测试则有效。我在 VSCode.

内的本地机器的终端中通过 pytest 调用测试

抛出此错误的测试之一:

def test_test(client):
    res = client.get("/1")
    assert res.status_code == 200

我已经对通过 pytest fixture 创建的用户 ID 进行了硬编码,但即使我将 ID 号设为动态(它始终为 1,因为我只创建了 1 个用户并在每次测试后重置了数据库会话)它有同样的问题。

我要测试的路线:

@router.get("/{id}", response_model=schemas.UserResponse)
def get_user(id: int, db: Session = Depends(get_db)):
    user = db.query(models.User).filter(models.User.id == id).first()

    if not user:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail=f"User with id: {id} does not exist.",
        )

    return user

以下是 运行 在无法正常工作的测试之前的测试

def test_create_user(client):
    res = client.post("/users/", json={"email": "test@test.com", "password": "password123"})
    new_user = schemas.UserResponse(**res.json())
    assert new_user.email == "test@test.com"
    assert res.status_code == 201


def test_login_user(client, test_user):
    res = client.post("/login", data={"username": test_user["email"], "password": test_user["password"]})
    login_res = schemas.Token(**res.json())
    payload = jwt.decode(login_res.access_token, settings.JWT_SECRET_KEY, algorithms=[settings.ALGORITHM])
    id_ = payload.get("user_id")
    assert id_ == test_user["id"]
    assert login_res.token_type == "bearer"
    assert res.status_code == 200

我试过在路线的尽头使用/,还是不行。我试图直接从目录调用测试并通过断点进行调试。但我不明白为什么它找不到这条路线(再加上 2 条,但我猜问题是一样的)。

如果您需要更多信息,请告诉我,我很乐意提供。

以下是我最满意的一些设置:

def override_get_db():
    db = TestingSessionLocal()
    try:
        yield db
    finally:
        db.close()


app.dependency_overrides[get_db] = override_get_db


@pytest.fixture()
def session(scope="session"):
    Base.metadata.drop_all(bind=engine)
    Base.metadata.create_all(bind=engine)
    db = TestingSessionLocal()
    try:
        yield db
    finally:
        db.close()


@pytest.fixture()
def client(session):
    def override_get_db():
        try:
            yield session
        finally:
            session.close()

    app.dependency_overrides[get_db] = override_get_db
    yield TestClient(app)


@pytest.fixture
def test_user(client):
    user_data = {"email": "testcreate@example.com", "password": "password123"}
    res = client.post("/users/", json=user_data)
    assert res.status_code == 201
    new_user = res.json()
    new_user["password"] = user_data["password"]
    return new_user

由于您没有在用户示例中显示安装路由器的位置,因此很难说,但我最初的猜测是您可能将其安装在 /users 下,并且缺少 [=13] =] 部分在 1 前面(因为用户 ID 直接在 / 下似乎有点奇怪)。

您的测试客户端仅请求 /1,而不是我期望的 /users/1 布局。

def test_user_can_be_retrieved(client):
    res = client.get("/users/1")
    assert res.status_code == 200

您可能还想在检索用户之前使用您的用户装置创建用户。我也会跳过从 API:

返回密码
@pytest.fixture
def created_user(client):
    user_data = {"email": "testcreate@example.com", "password": "password123"}
    res = client.post("/users", json=user_data)

    assert res.status_code == 201
    return res.json()


def test_user_can_be_retrieved(client, created_user):
    res = client.get("/users/1")
    assert res.status_code == 200
    user = res.json()

    assert user.username == created_user.username
    # etc.