我有一个包含多个路由文件的项目,每个路由文件都有一个APIRouter
。我将所有路由器包括在我的main.py
中,如下所示:
from init import app
import customer
import receipt
app.include_router(customer.router, prefix='/api/customer', tags=["Customer"])
app.include_router(receipt.router, prefix='/api/receipt', tags=["Receipt"])
init.py
from fastapi import FastAPI
app = FastAPI()
在customer.py
中,我有以下(简化的)代码:
from fastapi import APIRouter
from pydantic import BaseModel
router = APIRouter()
class CustomerModel(BaseModel):
name: str
@router.post('/')
def register_new_customer(data: CustomerModel):
pass
在我的receipt.py
中,我有类似的代码:
from fastapi import APIRouter
from pydantic import BaseModel
router = APIRouter()
class ReceiptModel(BaseModel):
price: float
@router.post('/')
def add_new_receipt(data: ReceiptModel):
pass
我还对这两个文件进行了单元测试。test_receipt.py
from receipt import router
from init import app
app.include_router(router)
client = TestClient(app)
class TestReceiptsRoutes:
def test_can_create_new_receipt(self):
response = client.post('/', json={'price': 10.0})
assert response.status_code == 200
与test_customer.py
类似
如果我单独运行每个文件,例如pytest test_receipt.py
或pytest test_customer.py
,它工作得很好,但当我将它们一起运行时,我的test_receipt.py
失败了,并指出response.status_code
是422
。发生的情况是,我的app
在/
路径上添加了两个POST路由,因此当receipt运行测试时,它实际上是在调用客户路由,并且验证失败。
问:如何确保app
不会在测试文件之间重用?
我知道我可以将app.include_router
行从main复制/粘贴到测试中(具有完整路径),这就是我目前正在做的一个变通办法,我只是想知道是否有一种方法可以确保应用程序在每个测试套件中都是独立的。
发布于 2021-01-28 10:50:10
假设app
对象是有状态的,那么重新加载init
模块,然后重新导入app
可能会有所帮助。
下面是如何使用fixture来完成此操作:
import pytest
from importlib import reload
import init
@pytest.fixture
def app():
app = reload(init).app
app.include_router(foo.router, ...)
return app
def test_foo(app):
client = TestClient(app)
...
https://stackoverflow.com/questions/65930017
复制相似问题