簡體   English   中英

我在嘗試使用 pytest for FastAPI + Gino 應用程序運行測試時遇到一個奇怪的錯誤

[英]I'm getting a weird error trying to run tests using pytest for FastAPI + Gino app

在測試中出現奇怪的錯誤。 我可能做錯了什么,但我不知道到底是什么。

client = <starlette.testclient.TestClient object at 0x10b6a1400>

    @pytest.fixture
    @pytest.mark.anyio
    async def user(client):

        print('[-------->')
        # await init_db()

        # async with db.acquire():
>       user = await UserModel.create(email='test@gmail.com')

test_bug.py:81:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
env/lib/python3.9/site-packages/gino/crud.py:444: in _create_without_instance
    return await cls(**values)._create(bind=bind, timeout=timeout)
env/lib/python3.9/site-packages/gino/crud.py:477: in _create
    row = await bind.first(q)
env/lib/python3.9/site-packages/gino/engine.py:748: in first
    return await conn.first(clause, *multiparams, **params)
env/lib/python3.9/site-packages/asyncpg/pool.py:224: in release
    raise ex
env/lib/python3.9/site-packages/asyncpg/pool.py:214: in release
    await self._con.reset(timeout=budget)
env/lib/python3.9/site-packages/asyncpg/connection.py:1367: in reset
    await self.execute(reset_query, timeout=timeout)
env/lib/python3.9/site-packages/asyncpg/connection.py:318: in execute
    return await self._protocol.query(query, timeout)
asyncpg/protocol/protocol.pyx:323: in query
    ???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

>   ???
E   asyncpg.exceptions._base.InterfaceError: cannot perform operation: another operation is in progress

這是我的要求.txt

fastapi==0.70.0
gino==1.0.1
pytest==6.2.5
pytest-asyncio==0.16.0
requests==2.26.0

這是一個不起作用的獨立示例。 要查看錯誤,只需輸入以下代碼test_bug.py並運行pytest

import os
from typing import List
import pytest

from gino import Gino
from fastapi import APIRouter
from pydantic import BaseModel
from fastapi import FastAPI
from starlette.testclient import TestClient

router = APIRouter()

db = Gino()


async def init_db():
    await db.set_bind(os.environ['DATABASE_URL'])
    await db.gino.create_all()


class UserModel(db.Model):
    __tablename__ = 'user'

    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.Unicode())
    email = db.Column(db.Unicode(), unique=True, index=True)
    password_hash = db.Column(db.Unicode())


class UserSchema(BaseModel):
    id: int = 0
    name: str
    email: str
    password: str


class UserListSchema(BaseModel):
    objects: List[UserSchema]


@router.get("/users/", response_model=UserListSchema)
async def get_users():
    async with db.acquire():
        users = await UserModel.query.limit(200).gino.all()

    return UserListSchema.parse_obj({
        'objects': [x.to_dict() for x in users]
    })


def get_app():
    print('INIT APP')
    app = FastAPI(title="GINO FastAPI Demo")

    app.include_router(router, prefix='/API/v1')

    @app.on_event("startup")
    async def startup_event():
        print('Initialising DB')
        await init_db()
        print('DB was initialised')

    return app


@pytest.fixture
def client():

    with TestClient(get_app()) as client:
        yield client


@pytest.fixture
@pytest.mark.anyio
async def user(client):

    print('[-------->')
    # await init_db()

    # async with db.acquire():
    user = await UserModel.create(email='test@gmail.com')

    # async with db.acquire():
    users = await UserModel.query.limit(200).gino.all()
    print('.....=', user)
    print('....._', users)

    yield user


def test_users(user, client):
    response = client.get(
        "/API/v1/users",
        headers={},
    )
    print('=====', user, response.text)

    assert response.status_code == 200
    assert response.json() == {}

你可以將starlette的版本降級到0.14.2來解決這個問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM