问题描述
使用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。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)