2013-04-27 23 views
3

我一直在試圖讓上傳表單上運行的測試。但是,無論何時我運行測試,它都會說該文件的類型是錯誤的。Django TestCase:SimpleUploadedFile顯示錯誤的文件類型

上傳形式的文件保存用文件名隨機生成:

class Video(models.Model): 
    def get_generated_path(self): 
     # Generates random path for video file upload 

    original_file = models.CharField(null=True) 
    uploaded_file = models.FileField(storage=FileSystemStorage(location= 
     settings.MEDIA_ROOT), upload_to=get_generated_path) 
    video_name = models.TextField() 

,並形成看起來像:

class VideoForm(forms.Form): 
     video_file = forms.FileField() 
     video_name = forms.CharField() 

     def clean_video_file(forms.Form): 
      content = self.cleaned_data['video_file'] 
      content_type = content.content_type.split('/')[0] 
      if content_type in settings.CONTENT_TYPES: 
       if content._size > settings.MAX_UPLOAD_SIZE: 
        raise forms.ValidationError(_('Please keep filesize under %s. 
         Current filesize %s') % (filesizeformat(
         settings.MAX_UPLOAD_SIZE), filesizeformat(content._size))) 
      else: 
       raise forms.ValidationError(_('File type is not supported, 
        content type is: %s' % content_type)) 
      return content 

其餘大多數的邏輯是在訪問量:

def upload_video(request): 
    try: 
     # Check if user is authenticated 
     if form.is_valid(): 
      video_file = request.FILES['video_file'] 
      video_name = form.cleaned_data['video_name'] 
      save_video = Video.objects.create(
        original_file = 'uploaded_videos' + user.username, 
        video_name = video_name) 
      return HTTPResponseRedirect('next-page') 
     except Exception, e: 
      ... 

測試寫爲:

def test_video_form(TestCase): 
    user = #Create a dummy user 
    test_video = SimpleUploadedFile('test_video.flv', open(
     'path/to/test/video', 'rb')) 
    form = VideoForm(user, {'video_name': test_video},) 
    self.assertTrue(form.is_valid()) 

上述測試總是失敗,因爲它說'test_video.flv'的文件類型是純文本/文本文件。我檢查了'test_video.flv'及其正確類型。 如何將這些文件傳遞給上傳表單並進行測試。

+0

您的表單在html中是否具有enctype =「multipart/form-data」? – boltsfrombluesky 2013-04-27 16:35:19

+0

是的,它在html中有enctype。 – n3rV3 2013-04-28 04:26:16

回答

3

SimpleUploadedFile默認情況下有content_typetext/plain。這就是爲什麼你的測試代碼去無法在​​這行:

raise forms.ValidationError(_('File type is not supported, 
       content type is: %s' % content_type)) 

是打印:

File type is not supported, 
       content type is: text/plain 

傳遞content_type = 'video'SimpleUploadedFile線,如下圖所示。

def test_video_form(TestCase): 
    user = #Create a dummy user 
    test_video = SimpleUploadedFile('test_video.flv', open(
    'path/to/test/video', 'rb'), content_type='video') # Notice the change here. 
    form = VideoForm(user, {'video_name': test_video},) 
    self.assertTrue(form.is_valid())