Fixed #34063 -- Made AsyncClient populate request.POST from form data body. 
diff --git a/django/test/client.py b/django/test/client.py
index 99e831aebda85..8b926fc38de75 100644
--- a/django/test/client.py
+++ b/django/test/client.py
@@ -14,7 +14,7 @@
 from django.conf import settings
 from django.core.handlers.asgi import ASGIRequest
 from django.core.handlers.base import BaseHandler
-from django.core.handlers.wsgi import WSGIRequest
+from django.core.handlers.wsgi import LimitedStream, WSGIRequest
 from django.core.serializers.json import DjangoJSONEncoder
 from django.core.signals import got_request_exception, request_finished, request_started
 from django.db import close_old_connections
@@ -198,7 +198,8 @@ async def __call__(self, scope):
             sender=self.__class__, scope=scope
         )
         request_started.connect(close_old_connections)
-        request = ASGIRequest(scope, body_file)
+        # Wrap FakePayload body_file to allow large read() in test environment.
+        request = ASGIRequest(scope, LimitedStream(body_file, len(body_file)))
         # Sneaky little hack so that we can easily get round
         # CsrfViewMiddleware. This makes life easier, and is probably required
         # for backwards compatibility with external tests against admin views.
@@ -598,7 +599,10 @@ def request(self, **request):
             body_file = request.pop("_body_file")
         else:
             body_file = FakePayload("")
-        return ASGIRequest(self._base_scope(**request), body_file)
+        # Wrap FakePayload body_file to allow large read() in test environment.
+        return ASGIRequest(
+            self._base_scope(**request), LimitedStream(body_file, len(body_file))
+        )
 
     def generic(
         self,
diff --git a/tests/test_client/tests.py b/tests/test_client/tests.py
index 57dc22ea0c34c..5612ae4462d31 100644
--- a/tests/test_client/tests.py
+++ b/tests/test_client/tests.py
@@ -1103,6 +1103,14 @@ async def test_get_data(self):
         response = await self.async_client.get("/get_view/", {"var": "val"})
         self.assertContains(response, "This is a test. val is the value.")
 
+    async def test_post_data(self):
+        response = await self.async_client.post("/post_view/", {"value": 37})
+        self.assertContains(response, "Data received: 37 is the value.")
+
+    async def test_body_read_on_get_data(self):
+        response = await self.async_client.get("/post_view/")
+        self.assertContains(response, "Viewing GET page.")
+
 
 @override_settings(ROOT_URLCONF="test_client.urls")
 class AsyncRequestFactoryTest(SimpleTestCase):
@@ -1147,6 +1155,16 @@ async def async_generic_view(request):
         self.assertEqual(response.status_code, 200)
         self.assertEqual(response.content, b'{"example": "data"}')
 
+    async def test_request_limited_read(self):
+        tests = ["GET", "POST"]
+        for method in tests:
+            with self.subTest(method=method):
+                request = self.request_factory.generic(
+                    method,
+                    "/somewhere",
+                )
+                self.assertEqual(request.read(200), b"")
+
     def test_request_factory_sets_headers(self):
         request = self.request_factory.get(
             "/somewhere/",
diff --git a/tests/test_client/views.py b/tests/test_client/views.py
index 773e9e4e987f3..01850257b5165 100644
--- a/tests/test_client/views.py
+++ b/tests/test_client/views.py
@@ -90,6 +90,8 @@ def post_view(request):
             c = Context()
     else:
         t = Template("Viewing GET page.", name="Empty GET Template")
+        # Used by test_body_read_on_get_data.
+        request.read(200)
         c = Context()
     return HttpResponse(t.render(c))
 

[Trac issue](https://code.djangoproject.com/ticket/34063)

We found that when `FakePayload` tries to `read` and is given a number of bytes that is larger than the available content, it hits an assert statement and fails.

When we (@kevswanberg @carltongibson) compared this to the WSGI `TestClient`, we noticed that it converted its `_stream` member to a `LimitedStream`, which has a more robust `read` method.

When we made this change to `asgi.py` we found that the `test_client` tests still passed