2013-04-27 5 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

Имеет ли ваша форма enctype = "multipart/form-data" в html? – boltsfrombluesky

+0

Да, он имеет enctype в html. – n3rV3

ответ

3

SimpleUploadedFile имеет content_typetext/plain по умолчанию. Именно поэтому ваш код тестирования идет сбой в clean_video_file и эта линия:

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()) 
Смежные вопросы