diff --git a/docs/api-guide/testing.md b/docs/api-guide/testing.md index ed585faf2..191e5af4f 100644 --- a/docs/api-guide/testing.md +++ b/docs/api-guide/testing.md @@ -105,6 +105,20 @@ This means that setting attributes directly on the request object may not always request.user = user response = view(request) +If you want to test a request involving the REST framework’s 'Request' object, you’ll need to manually transform it first: + + class DummyView(APIView): + ... + + factory = APIRequestFactory() + request = factory.get('/', {'demo': 'test'}) + DRF_request = DummyView().initialize_request(request) + assert DRF_request.query_params == {'demo': ['test']} + + request = factory.post('/', {'example': 'test'}) + DRF_request = DummyView().initialize_request(request) + assert DRF_request.data.get('example') == 'test' + --- ## Forcing CSRF validation diff --git a/tests/test_testing.py b/tests/test_testing.py index 26a6e8ffb..25f447c66 100644 --- a/tests/test_testing.py +++ b/tests/test_testing.py @@ -294,6 +294,26 @@ class TestAPIRequestFactory(TestCase): assert response.status_code == 403 assert response.data == expected + def test_transform_factory_django_request_to_drf_request(self): + from rest_framework.views import APIView + + factory = APIRequestFactory() + + class DummyView(APIView): + ... + + request = factory.get('/', {'demo': 'test'}) + DRF_request = DummyView().initialize_request(request) + assert DRF_request.query_params == {'demo': ['test']} + assert not hasattr(DRF_request, 'accepted_media_type') + + DummyView().initial(DRF_request) + assert DRF_request.accepted_media_type == 'application/json' + + request = factory.post('/', {'example': 'test'}) + DRF_request = DummyView().initialize_request(request) + assert DRF_request.data.get('example') == 'test' + def test_invalid_format(self): """ Attempting to use a format that is not configured will raise an