I am trying to test my update method on my viewset. The viewset is a modelviewset taken from drf. To update i would need to send a put request. As this is not always supported there are 2 ways to tell the server i am making a put request, the first which does not fit my needs is to use an additional field to form called _method
and set it to put
. As i need to post json data i need to use the second way, which uses the X-HTTP-Method-Override
header.
To post my data in the testcase i use the following code:
header = {'X_HTTP_METHOD_OVERRIDE': 'PUT'} response = client.post('/model/1/', content_type='application/json', data=post_data_clean, **header)
But unfortunately the result I get is {'detail':'Method POST not allowed.'}
. I tested the behavior of the server using a addon (Postman) where i specified the X-HTTP-Method-Override
header too. No exception is raised. I need to know now how to correctly pass the header to the django test client, otherwise testing will get really annoying over here.
You need to specify header as 'HTTP_X_HTTP_METHOD_OVERRIDE'
instead of 'X_HTTP_METHOD_OVERRIDE'
i.e. add HTTP_
at the beginning of the header.
header = {'HTTP_X_HTTP_METHOD_OVERRIDE': 'PUT'} response = client.post('/model/1/', content_type='application/json', data=post_data_clean, **header)
From the Django documentation:
HTTP headers in the request are converted to
META
keys by converting all characters to uppercase, replacing any hyphens with underscores and adding anHTTP_
prefix to the name. So, for example, a header calledX-Bender
would be mapped to theMETA
keyHTTP_X_BENDER
.
Also, you can pass headers to the constructor of the Client:
from django.test import Client client = Client(HTTP_USER_AGENT="Mozilla/5.0 ...", HTTP_X_USER_ID="982734")
This way every request will contain default headers.
PS: This approach is valid for DRF TestApiClient and ApiRequestFactory.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With