How to disable server exceptions on fast-api when testing with httpx AsyncClient?
Asked Answered
P

2

9

We have a FastApi app and using httpx AsyncClient for testing purposes. We are experiencing a problem where the unit tests run locally fine but fail on the CI server (Github Actions).

After further research we have come across this proposed solution by setting raise_server_exceptions=False to False.

client = TestClient(app, raise_server_exceptions=False)

However this is for the sync client. We are using the async client.

@pytest.fixture
async def client(test_app):
    async with AsyncClient(app=test_app, base_url="http://testserver") as client:
        yield client

The AsyncClient does not support the raise_app_exceptions=False option.

Does anyone have experience with this? Thanks

Proficient answered 12/10, 2021 at 14:20 Comment(0)
B
2

The problem is caused by FastApi version. You can use fastapi==0.65.0 and even without the ASGITransport object and the raise_app_exceptions=False flag you will be able to run the tests which are checking for custom exception raising.

Also the fastapi version should be frozen in the requirements file.

You can read more here

Blessed answered 13/10, 2021 at 9:43 Comment(1)
Ahh I see. This is a bug in 0.70.0 version.Proficient
N
4

For httpx v0.14.0+ you need to use httpx.ASGITransport. Excerpt from the 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.

For example:

# 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:
    ...
Nighthawk answered 12/10, 2021 at 14:44 Comment(1)
This answer worked for me, I just have an warning error on app=app -> Type "BaseAPI" cannot be assigned to type "_ASGIApp"Stewardson
B
2

The problem is caused by FastApi version. You can use fastapi==0.65.0 and even without the ASGITransport object and the raise_app_exceptions=False flag you will be able to run the tests which are checking for custom exception raising.

Also the fastapi version should be frozen in the requirements file.

You can read more here

Blessed answered 13/10, 2021 at 9:43 Comment(1)
Ahh I see. This is a bug in 0.70.0 version.Proficient

© 2022 - 2024 — McMap. All rights reserved.