使用 httpx AsyncClient 测试时如何在 fast-api 上禁用服务器异常?
How to disable server exceptions on fast-api when testing with httpx AsyncClient?
我们有一个 FastApi 应用程序并使用 httpx AsyncClient 进行测试。我们遇到了单元测试 运行 在本地正常但在 CI 服务器(Github 操作)上失败的问题。
经过进一步研究,我们通过将 raise_server_exceptions=False
设置为 False
来发现这个 proposed solution。
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
。
摘自official documentation:
For some more complex cases you might need to customise the ASGI transport. This allows you to:
- Inspect 500 error responses rather than raise exceptions by setting raise_app_exceptions=False.
- Mount the ASGI application at a subpath by setting root_path.
- Use a given client address for requests by setting client.
例如:
# 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 版本应冻结在需求文件中。
你可以阅读更多 here
我们有一个 FastApi 应用程序并使用 httpx AsyncClient 进行测试。我们遇到了单元测试 运行 在本地正常但在 CI 服务器(Github 操作)上失败的问题。
经过进一步研究,我们通过将 raise_server_exceptions=False
设置为 False
来发现这个 proposed solution。
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
。
摘自official documentation:
For some more complex cases you might need to customise the ASGI transport. This allows you to:
- Inspect 500 error responses rather than raise exceptions by setting raise_app_exceptions=False.
- Mount the ASGI application at a subpath by setting root_path.
- Use a given client address for requests by setting client.
例如:
# 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 版本应冻结在需求文件中。 你可以阅读更多 here