【问题标题】:Django TestCase: SimpleUploadedFile shows wrong filetypeDjango TestCase:SimpleUploadedFile 显示错误的文件类型
【发布时间】:2013-04-27 09:12:03
【问题描述】:

我一直在尝试在上传表单上运行测试。但是,每当我运行测试时,它都会说该文件的类型错误。

上传表单以随机生成的文件名保存文件:

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”及其正确类型。 如何将这些文件传递给上传表单并进行测试。

【问题讨论】:

  • 您的表单在 html 中有 enctype="multipart/form-data" 吗?
  • 是的,它在html中有enctype。

标签: django django-testing


【解决方案1】:

SimpleUploadedFile 默认具有content_type text/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

如下所示,在SimpleUploadedFile 行中传递content_type = 'video'

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())

【讨论】:

    猜你喜欢
    • 2019-03-03
    • 2018-01-27
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 2011-10-26
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多