首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >防止Pytest在不同测试文件之间重用app对象

防止Pytest在不同测试文件之间重用app对象
EN

Stack Overflow用户
提问于 2021-01-28 10:02:41
回答 1查看 106关注 0票数 0

我有一个包含多个路由文件的项目,每个路由文件都有一个APIRouter。我将所有路由器包括在我的main.py中,如下所示:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
from fastapi import FastAPI
app = FastAPI()

customer.py中,我有以下(简化的)代码:

代码语言:javascript
运行
复制
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中,我有类似的代码:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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.pypytest test_customer.py,它工作得很好,但当我将它们一起运行时,我的test_receipt.py失败了,并指出response.status_code422。发生的情况是,我的app/路径上添加了两个POST路由,因此当receipt运行测试时,它实际上是在调用客户路由,并且验证失败。

问:如何确保app不会在测试文件之间重用?

我知道我可以将app.include_router行从main复制/粘贴到测试中(具有完整路径),这就是我目前正在做的一个变通办法,我只是想知道是否有一种方法可以确保应用程序在每个测试套件中都是独立的。

EN

回答 1

Stack Overflow用户

发布于 2021-01-28 10:50:10

假设app对象是有状态的,那么重新加载init模块,然后重新导入app可能会有所帮助。

下面是如何使用fixture来完成此操作:

代码语言:javascript
运行
复制
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)
    ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65930017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档