2017-02-16 3 views
0

Ich arbeite an einem Testfall für mein Projekt, mit einigen Image und FileFields. Einige Objekte werden mit Fixtures geladen, einige Objekte werden während der Tests erstellt. Ich verspottete mein Bild mit einer InMemoryUploadedFile.Django Test verspottet ImageField verhindert Upload oder Säuberung nach Tests

Beim Erstellen eines neuen Testobjekts wird das gespiegelte Bild in das Verzeichnis MEDIA_ROOT an der korrekten Position hochgeladen, die in der upload_to-Methode definiert ist, .

Diese gespotteten Bilder werden während der Tests tatsächlich lokal gespeichert. Es gibt ziemlich viele Informationen über , wie man ein Bild vortäuscht. Aber ich konnte nicht wirklich gute Informationen über das Aufräumen dieser Uploads nach den Tests finden.

Frage:
Gibt es eine Möglichkeit, diese Dateien von tatsächlich werden Hochladen zu verhindern, oder ist dies unmöglich/dis-ermutigt?

oder
Sollten diese Dateien, die für die Tests hochgeladen (wenn ja, warum?), Und danach während der tearDown gereinigt? Und was wäre ein geeigneter Weg, um diese hochgeladenen Dateien zu bereinigen?

Einige Code der aktuellen Situation, mit der ich arbeite, zugeschnitten auf die Größe, um die Frage zu passen. Ich suche kein voll ausgearbeitetes Sample, sondern nur einen Schub in die richtige Richtung. Vielen Dank für Ihre Zeit im Voraus.

Geerntete Modell:

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) 

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

Antwort

1

ich den Ansatz mit testing-a-model-that-have-an-imagefield geändert haben. Das Bild wird in ein temporäres Verzeichnis hochgeladen. Der Leitfaden rät, das Verzeichnis in der tearDown zu entfernen. Es könnte aktualisiert werden, da das Verzeichnis temp/automatisch entfernt wird. Alle Tests wurden ordnungsgemäß bestanden.

Alte Antwort
konnte ich die Lagerung mit einem mock.patch() auf default_storage von 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) 

Leider ein update() im save() Methode enthält Ich bin nicht in der Lage verspotten, ein Modell zu testen, die : django-mocking-storage-on-model-with-update-throws-error

Verwandte Themen