vasek1 vasek1 - 1 month ago 14
Python Question

django - how to unit test a post request using request.FILES

I have the following logic in my view:

def view_function(request):
if request.method == 'POST':
uploadform = UploadFileForm(request.POST, request.FILES)
if uploadform.is_valid():
#do stuff


Where UploadFileForm equals to:

class UploadFileForm(forms.Form):
file = forms.FileField()


I am trying to write unit tests for this view. Looking in Django docs, the suggested way is this:

class test_stuffTest(TestCase):
def setUp(self):
self.client = django.test.client.Client()
...
def test_stuff(self):
myfile = open('....\file.csv','r')
response = self.client.post('/', {'name':'file.csv','attachment':myfile})
#check response


My goal is to get uploadform.is_valid() to evaluate to True, so I can test the code which follows the form validation. When I run the test above, uploadform.is_valid() evaluates to False. Is there anything I am missing? Is the code in my test adding the file to request.FILES, or is it doing something else?

Answer

In the docs, the file field is called attachment, but in yours, it's called file.

You don't need name in your post data either -- that refers to another field called name, not the name of the file that you are uploading.

Try the following:

def test_stuff(self): 
    myfile = open('....\file.csv','r') 
    response = self.client.post('/', {'file':myfile})
Comments