使用 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