You can use the TestClient class to test FastAPI applications without creating an actual HTTP and socket connection, just communicating directly with the FastAPI code.
defbuild_request(self,method:str,url:URL|str,*,content:RequestContent|None=None,data:RequestData|None=None,files:RequestFiles|None=None,json:typing.Any|None=None,params:QueryParamTypes|None=None,headers:HeaderTypes|None=None,cookies:CookieTypes|None=None,timeout:TimeoutTypes|UseClientDefault=USE_CLIENT_DEFAULT,extensions:RequestExtensions|None=None,)->Request:""" Build and return a request instance. * The `params`, `headers` and `cookies` arguments are merged with any values set on the client. * The `url` argument is merged with any `base_url` set on the client. See also: [Request instances][0] [0]: /advanced/clients/#request-instances """url=self._merge_url(url)headers=self._merge_headers(headers)cookies=self._merge_cookies(cookies)params=self._merge_queryparams(params)extensions={}ifextensionsisNoneelseextensionsif"timeout"notinextensions:timeout=(self.timeoutifisinstance(timeout,UseClientDefault)elseTimeout(timeout))extensions=dict(**extensions,timeout=timeout.as_dict())returnRequest(method,url,content=content,data=data,files=files,json=json,params=params,headers=headers,cookies=cookies,extensions=extensions,)
@contextmanagerdefstream(self,method:str,url:URL|str,*,content:RequestContent|None=None,data:RequestData|None=None,files:RequestFiles|None=None,json:typing.Any|None=None,params:QueryParamTypes|None=None,headers:HeaderTypes|None=None,cookies:CookieTypes|None=None,auth:AuthTypes|UseClientDefault|None=USE_CLIENT_DEFAULT,follow_redirects:bool|UseClientDefault=USE_CLIENT_DEFAULT,timeout:TimeoutTypes|UseClientDefault=USE_CLIENT_DEFAULT,extensions:RequestExtensions|None=None,)->typing.Iterator[Response]:""" Alternative to `httpx.request()` that streams the response body instead of loading it into memory at once. **Parameters**: See `httpx.request`. See also: [Streaming Responses][0] [0]: /quickstart#streaming-responses """request=self.build_request(method=method,url=url,content=content,data=data,files=files,json=json,params=params,headers=headers,cookies=cookies,timeout=timeout,extensions=extensions,)response=self.send(request=request,auth=auth,follow_redirects=follow_redirects,stream=True,)try:yieldresponsefinally:response.close()
Typically you'll want to build one with Client.build_request()
so that any client-level configuration is merged into the request,
but passing an explicit httpx.Request() is supported as well.
defsend(self,request:Request,*,stream:bool=False,auth:AuthTypes|UseClientDefault|None=USE_CLIENT_DEFAULT,follow_redirects:bool|UseClientDefault=USE_CLIENT_DEFAULT,)->Response:""" Send a request. The request is sent as-is, unmodified. Typically you'll want to build one with `Client.build_request()` so that any client-level configuration is merged into the request, but passing an explicit `httpx.Request()` is supported as well. See also: [Request instances][0] [0]: /advanced/clients/#request-instances """ifself._state==ClientState.CLOSED:raiseRuntimeError("Cannot send a request, as the client has been closed.")self._state=ClientState.OPENEDfollow_redirects=(self.follow_redirectsifisinstance(follow_redirects,UseClientDefault)elsefollow_redirects)self._set_timeout(request)auth=self._build_request_auth(request,auth)response=self._send_handling_auth(request,auth=auth,follow_redirects=follow_redirects,history=[],)try:ifnotstream:response.read()returnresponseexceptBaseExceptionasexc:response.close()raiseexc
defclose(self)->None:""" Close transport and proxies. """ifself._state!=ClientState.CLOSED:self._state=ClientState.CLOSEDself._transport.close()fortransportinself._mounts.values():iftransportisnotNone:transport.close()
defrequest(# type: ignore[override]self,method:str,url:httpx._types.URLTypes,*,content:httpx._types.RequestContent|None=None,data:_RequestData|None=None,files:httpx._types.RequestFiles|None=None,json:typing.Any=None,params:httpx._types.QueryParamTypes|None=None,headers:httpx._types.HeaderTypes|None=None,cookies:httpx._types.CookieTypes|None=None,auth:httpx._types.AuthTypes|httpx._client.UseClientDefault=httpx._client.USE_CLIENT_DEFAULT,follow_redirects:bool|httpx._client.UseClientDefault=httpx._client.USE_CLIENT_DEFAULT,timeout:httpx._types.TimeoutTypes|httpx._client.UseClientDefault=httpx._client.USE_CLIENT_DEFAULT,extensions:dict[str,typing.Any]|None=None,)->httpx.Response:iftimeoutisnothttpx.USE_CLIENT_DEFAULT:warnings.warn("You should not use the 'timeout' argument with the TestClient. ""See https://github.com/encode/starlette/issues/1108 for more information.",DeprecationWarning,)url=self._merge_url(url)returnsuper().request(method,url,content=content,data=data,files=files,json=json,params=params,headers=headers,cookies=cookies,auth=auth,follow_redirects=follow_redirects,timeout=timeout,extensions=extensions,)