2017-02-16 7 views
0

ImageとFileFieldを含む私のプロジェクト用のTestCaseで作業しています。一部のオブジェクトにはフィクスチャがロードされ、一部のオブジェクトはテスト中に作成されます。私はInMemoryUploadedFileで私のイメージを嘲笑した。Django Test模擬ImageFieldは、テスト後にアップロードやクリーンアップを防ぐ

新しいテストオブジェクトを作成すると、模造されたイメージがupload_toメソッドで定義された正しい場所にあるのMEDIA_ROOTディレクトリにアップロードされています。

これらの模擬画像は実際にテスト中にローカルに保存されています。 の画像を模擬する方法についてのかなりの情報がありますしかし、テスト後にこれらのアップロードをクリーンアップするための良い情報を見つけることはできませんでした。

質問
が実際にアップロードされているから、これらのファイルを防止する可能性があるか、このことは不可能/ DISは、奨励しているのですか?

または
これらのファイルはテストの賛成でアップロードされているべきである(もしそうなら、なぜですか?)、およびティアダウンの間に、その後洗浄?これらのアップロードされたファイルをクリーンアップする適切な方法は何でしょうか?

私は現在取り組んでいる状況のいくつかのコードは、問題に合わせてサイズに切り詰めました。私は完全にワークアウトされたサンプルを探しているわけではなく、正しい方向にプッシュするだけです。事前にお時間をいただきありがとうございます。

モデルをクロップ:

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をクロップ:

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とアプローチを変更しました。イメージはtempディレクトリにアップロードされます。このガイドでは、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

関連する問題