我们有一个FastApi应用程序,并使用httpx AsyncClient进行测试。我们遇到了一个问题,单元测试在本地运行良好,但在CI服务器上失败(Github Actions)。
在进一步的研究之后,我们通过将raise_server_exceptions=False
设置为False
来获得这个所提出的解决方案。
client = TestClient(app, raise_server_exceptions=False)
但是,这是针对同步客户端的。我们正在使用异步客户端。
@pytest.fixture
async def client(test_app):
async with AsyncClient(app=test_app, base_url="http://testserver") as client:
yield client
AsyncClient不支持raise_app_exceptions=False
选项。
有人有这方面的经验吗?感谢
对于httpx
v0.14.0+,您需要使用httpx.ASGITransport
。官方文件摘录:
对于一些更复杂的情况,您可能需要自定义ASGI传输。这允许您:
- 通过设置raise_app_exceptions=False,检查500个错误响应,而不是引发异常
- 通过设置root_path在子路径上装载ASGI应用程序
- 通过设置客户端,为请求使用给定的客户端地址
例如:
# Instantiate a client that makes ASGI requests with a client IP of "1.2.3.4",
# on port 123.
transport = httpx.ASGITransport(app=app, raise_app_exceptions=False,
client=("1.2.3.4", 123))
async with httpx.AsyncClient(transport=transport, base_url="http://testserver") as client:
...
问题是由FastApi版本引起的。您可以使用fastapi==0.65.0
,甚至在不使用ASGITransport对象和raise_app_exceptions=False
标志的情况下使用,您将能够运行检查自定义异常引发的测试。
此外,fastapi版本应该冻结在需求文件中。
你可以在这里阅读更多