2017-02-16 1 views
0

Je travaille sur un TestCase pour mon projet, impliquant Image et FileFields. Certains objets sont chargés avec des appareils, certains objets sont créés pendant les tests. Je me suis moqué de mon image avec un fichier InMemoryUploadedFile.Django Test mocké ImageField empêcher le téléchargement ou nettoyer après les tests

Lors de la création d'un nouvel objet de test, l'image simulée est en cours de téléchargement dans le répertoire MEDIA_ROOT, à l'emplacement correct défini dans la méthode upload_to.

Ces images simulées sont actuellement stockées localement pendant les tests. Il y a quelques informations sur comment se moquer d'une image. Mais je ne pouvais pas vraiment trouver de bonnes informations sur le nettoyage de ces téléchargements après les tests.

Question:
Est-il possible d'éviter ces fichiers effectivement téléchargé ou est-ce impossible/dis-encouragés?

ou
Si ces fichiers en cours de téléchargement en faveur des essais (si oui, pourquoi?), Et nettoyé après lors du démontage du moteur? Et quel serait un moyen approprié de nettoyer ces fichiers téléchargés?

Un peu de code de la situation actuelle avec laquelle je travaille, recadrée à la taille pour correspondre à la question. Je ne cherche pas un échantillon complet, mais juste une poussée dans la bonne direction. Merci pour votre temps à l'avance.

recadrée modèle:

def project_image_upload_location(instance, filename): 
    return 'uploads/projects/images/%s' % \ 
     services.unique_filename(filename) 


class ProjectImage(models.Model): 
    project = models.ForeignKey(
     'projects.Project') 
    name = models.CharField(
     _("Image name"), 
     max_length=35) 
    image = models.ImageField(
     _("Project image"), 
     upload_to=project_image_upload_location, 
     width_field='image_width', 
     height_field='image_height') 
    image_width = models.IntegerField(
     default=0) 
    image_height = models.IntegerField(
     default=0) 

Coupées TestCase:

from django.core.files.uploadedfile import InMemoryUploadedFile 
from django.test import TestCase 
from PIL import Image 
import StringIO 

from projects.models import ProjectImage 
from projects import services 


class ProjectsTest(TestCase): 
    fixtures = ['projects'] 

    def _create_project_image(self, project, name): 
     return ProjectImage.objects.create(
       project=project, 
       name=name, 
       description="Description", 
       image=self._create_mock_image(name="Mocked Image"), 
       is_primary=True, 
       is_published=True) 

     def _get_project_image(self, name): 
      return ProjectImage.objects.get(name=name) 

    def _create_mock_image(self, name): 
     name = name + '.jpg' 
     io = StringIO.StringIO() 
     size = (200,200) 
     color = (255,0,0) 
     image = Image.new("RGB", size, color) 
     image.save(io, format='JPEG') 
     image_file = InMemoryUploadedFile(io, None, name, 'jpeg', io.len, None) 
     image_file.seek(0) 
     return image_file 

    def test_update_project_set_updated_datetime(self): 
     project = self._get_project("Project B") 
     self.assertEqual(project.updated_datetime, None) 

     project.save() 
     self.assertTrue(isinstance(project.updated_datetime, datetime)) 

Répondre

1

J'ai changé l'approche avec testing-a-model-that-have-an-imagefield. L'image sera téléchargée dans un répertoire temporaire. Le guide conseille de supprimer le répertoire dans le tearDown. Il pourrait être mis à jour, car le répertoire temp/est automatiquement supprimé. Tous les tests ont été correctement passés.

Vieille réponse
j'ai pu railler le stockage avec un mock.patch() sur default_storage de joeray.me: mocking-files-and-file-storage-for-testing-django-models

<..crop..> 
import mock 

current_storage = 'django.core.files.storage.default_storage._wrapped' 
def _mock_storage(): 
    return mock.MagicMock(spec=Storage, name="StorageMock") 

class ProjectsTest(TestCase): 
    fixtures = ['projects'] 

    @mock.patch(current_storage, _mock_storage()) 
    def _create_project(self, name): 
    return Project.objects.create(
      name=name, 
      short_description="Short description A", 
      full_description="Full description A", 
      url="http://test-project-url.com/", 
      is_published=True) 

Malheureusement, je ne suis pas en mesure de tester un modèle qui contient un update() dans la méthode save() : django-mocking-storage-on-model-with-update-throws-error