From 0baeaf2d8f3182e3a0af03ad0f855ef41fed2a74 Mon Sep 17 00:00:00 2001 From: Sam Morrow Date: Tue, 9 Dec 2025 13:15:35 +0100 Subject: [PATCH] fix: set default elapsed on MockTransport responses When creating a Response with pre-loaded content (e.g., json=...), the BoundSyncStream is never consumed, so elapsed is never set. This causes a RuntimeError when accessing response.elapsed. This fix sets a default elapsed of timedelta(0) if not already set, allowing users to access response.elapsed without errors while still preserving any user-set elapsed values. Fixes #3712 --- httpx/_transports/mock.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/httpx/_transports/mock.py b/httpx/_transports/mock.py index 8c418f59e0..f0b8aa0007 100644 --- a/httpx/_transports/mock.py +++ b/httpx/_transports/mock.py @@ -1,5 +1,6 @@ from __future__ import annotations +import datetime import typing from .._models import Request, Response @@ -24,6 +25,8 @@ def handle_request( response = self.handler(request) if not isinstance(response, Response): # pragma: no cover raise TypeError("Cannot use an async handler in a sync Client") + if not hasattr(response, "_elapsed"): + response.elapsed = datetime.timedelta(0) return response async def handle_async_request( @@ -40,4 +43,6 @@ async def handle_async_request( if not isinstance(response, Response): response = await response + if not hasattr(response, "_elapsed"): + response.elapsed = datetime.timedelta(0) return response