Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 647
vasek1 Avatar asked Mar 03 '12 20:03

vasek1


1 Answers

The way django's testsuite does it is:

from django.core.files.uploadedfile import SimpleUploadedFile
f = SimpleUploadedFile("file.txt", b"file_content")

This way you don't need to create a temp file and write to it, and you don't need to mock a file (not as easy as it sounds).

like image 69
radu.ciorba Avatar answered Sep 19 '22 19:09

radu.ciorba