2017-02-16 5 views
0

Image 및 FileFields와 관련된 프로젝트 용 TestCase에서 작업 중입니다. 일부 오브젝트에는 조명기가로드되고 일부 오브젝트는 테스트 중에 작성됩니다. 내 이미지를 InMemoryUploadedFile로 조롱했습니다.Django Test ImageField가 테스트 후 업로드 또는 정리를 막아 버렸습니다.

새 테스트 객체를 만들 때 조롱 된 이미지는 upload_to 메소드에 정의 된 올바른 위치에 의 MEDIA_ROOT 디렉토리에 업로드됩니다.

이러한 조롱 된 이미지는 테스트 중에 실제로 로컬에 저장됩니다. 에 대한 약간의 정보가 있습니다.. 그러나 테스트 후에 이러한 업로드를 정리하는 데 대한 좋은 정보를 찾을 수 없었습니다.

질문 :
실제로 업로드되는이 파일을 방지하기 위해 가능성이있는 경우, 또는이 불가능/DIS가-격려입니까?

또는
이러한 파일은 (만약 그렇다면, 왜?) 시험에 찬성 업로드와의 tearDown시 이후 청소하고해야 하는가? 업로드 된 파일을 정리하는 적절한 방법은 무엇입니까?

현재 작업하고있는 코드 중 일부는 크기에 맞게 잘랐다. 나는 완벽하게 해결 된 표본을 찾는 것이 아니라 올바른 방향으로 추진하는 방법을 찾고 있습니다. 사전에 시간 내 주셔서 감사합니다.

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

답변

1

내가 testing-a-model-that-have-an-imagefield와 접근 방식을 변경했습니다 :

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) 

립니다의 TestCase :

모델을 잘립니다. 이미지가 임시 디렉토리에 업로드됩니다. 이 가이드는 tearDown에있는 디렉터리를 제거 할 것을 권장합니다. temp/디렉토리가 자동으로 제거되므로 업데이트 될 수 있습니다. 모든 테스트가 제대로 통과했습니다.

올드 대답
나는 불행하게도 나는 save() 방법 내에서 update()을 포함하는 모델을 테스트 할 수 아니에요 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) 

에서 default_storagemock.patch()와 스토리지를 조롱 할 수 있었다 : django-mocking-storage-on-model-with-update-throws-error