4 votes

Django TestCase : SimpleUploadedFile affiche un mauvais type de fichier

J'ai essayé de faire fonctionner les tests sur les formulaires de téléchargement. Mais chaque fois que je lance les tests, il dit que le fichier est du mauvais type.

Le formulaire de téléchargement enregistre le fichier avec un nom de fichier généré aléatoirement :

classe Vidéo(models.Model):
    def get_generated_path(self):
        # Génère un chemin aléatoire pour le téléchargement du fichier vidéo

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

Et le formulaire ressemble à :

 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(_('Veuillez garder la taille du fichier sous %s. 
                      Taille actuelle %s') % (filesizeformat(
                      settings.MAX_UPLOAD_SIZE), filesizeformat(content._size)))
          else:
              raise forms.ValidationError(_('Le type de fichier n'est pas pris en charge, 
                  le type de contenu est : %s' % content_type))
          return content

La plupart de la logique restante se trouve dans les vues :

 def upload_video(request):
     try:
         # Vérifier si l'utilisateur est authentifié
         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('page-suivante')
      except Exception, e:
             ...

Les tests sont écrits comme suit :

def test_video_form(TestCase):
    user = # Créer un utilisateur factice
    test_video = SimpleUploadedFile('test_video.flv', open(
        'chemin/vers/vidéo/test', 'rb'))
    form = VideoForm(user, {'video_name': test_video}, )
    self.assertTrue(form.is_valid())

Le test ci-dessus échoue toujours car il dit que le type de fichier de 'test_video.flv' est text/plain. J'ai vérifié que 'test_video.flv' est du bon type. Comment passer ces fichiers au formulaire de téléchargement et les tester.

4voto

Amit Yadav Points 1802

SimpleUploadedFile a le content_type text/plain par défaut. C'est pourquoi votre code de test échoue dans clean_video_file et cette ligne:

 raise forms.ValidationError(_('Type de fichier non pris en charge, le type de contenu est: %s' % content_type))

affiche :

Type de fichier non pris en charge, 
              le type de contenu est: text/plain

Transmettez content_type = 'video' dans la ligne de SimpleUploadedFile comme indiqué ci-dessous.

def test_video_form(TestCase):
    user = # Créer un utilisateur factice
    test_video = SimpleUploadedFile('test_video.flv', open(
    'chemin/vers/vidéo/de/test', 'rb'), content_type='video') # Remarquez le changement ici.
    form = VideoForm(user, {'video_name': test_video}, )
    self.assertTrue(form.is_valid())

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X