带有FastAPI问题的依赖注入

问题描述

使用dependency_overrides时出现错误 https://fastapi.tiangolo.com/advanced/testing-dependencies/

我有一个示例项目(附件),其结构如下:

service.py

from pydantic import BaseModel
class Service(BaseModel):
    key: int
    name: str

handler.py

from service import Service

class ServiceHandler:
    async def get_all(self):
        return [Service(**x) for x in
                [{'key': 1,'name': 'One'},{'key': 2,'name': 'Two'}]]

factory.py

from fastapi import Depends
from handler import ServiceHandler

async def get_service_handler(handler=Depends(ServiceHandler)):
    return handler

main.py

from fastapi import FastAPI,APIRouter,Depends
import factory

router = APIRouter()
@router.get("/services/",tags=["services"])
async def get_services(handler=Depends(factory.get_service_handler)):
    return await handler.get_all()

app = FastAPI()
app.include_router(router)

and pytest+pytest-mock unit test for route:

unit_tests / test.py

import...
@pytest.fixture(scope="session",autouse=True)
def client():
    return TestClient(app)

def test_get_services(client,mocker):
    handler = ServiceHandler()
    mocker.patch.object(handler,'get_all')
    handler.get_all.return_value = [Service(_id=None,key=1,name='Test')]
    app.dependency_overrides[factory.get_service_handler] = handler

    response = client.get("/services")

    assert response.status_code == 200
    # expected = [{'_id': None,'key': 1,'name': 'Test'}]
    expected = [{'_id': None,{'_id': None,'key': 2,'name': 'Two'}]
    assert response.json() == expected

    app.dependency_overrides = {}

当我用以下命令运行它时: pytest unit_tests/test.py 我有一个例外Failed unit_tests/test.py::test_get_services - TypeError: <handler.ServiceHandler object at 0x7fd03d813b50> is not a callable object

我尝试将通话添加到handler.py中,如下所示:

...
class ServiceHandler:
    def __call__(self):
        pass
...

一个例外发生了: Failed unit_tests/test.py::test_get_services - AttributeError: 'nonetype' object has no attribute 'get_all'

毕竟,如果我启动服务器: hypercorn main:app --reload http://127.0.0.1:8000/services/ 一切都可以正常工作。

如果我注释掉test.py中的行:

...
app.dependency_overrides[factory.get_service_handler] = handler
...

然后该测试将起作用,所以我猜想问题的原因在于dependency_overrides。

depends_demo.zip

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)