DjangoアプリケーションのPhotoモデルをテストする必要があります。ImageFieldをテスト画像ファイルでモックするにはどうすればよいですか?
tests.py
class PhotoTestCase(TestCase):
def test_add_photo(self):
newPhoto = Photo()
newPhoto.image = # ??????
newPhoto.save()
self.assertEqual(Photo.objects.count(), 1)
将来のユーザーのために、私は問題を解決しました。 SimpleUploadedFileインスタンスを使用してImageFieldをモックできます。
test.py
from Django.core.files.uploadedfile import SimpleUploadedFile
newPhoto.image = SimpleUploadedFile(name='test_image.jpg', content=open(image_path, 'rb').read(), content_type='image/jpeg')
DjangoのFileクラスに基づいてモックオブジェクトを作成するようにモックライブラリに指示する
import mock
from Django.core.files import File
file_mock = mock.MagicMock(spec=File, name='FileMock')
テストで使用します
newPhoto.image = file_mock
tempfile
を使用して、一時ファイルを使用できます。したがって、テストを行うために実際のファイルは必要ありません。
_import tempfile
image = tempfile.NamedTemporaryFile(suffix=".jpg").name
_
手動でクリーンアップする場合は、代わりにtempfile.mkstemp()
を使用してください。
解決:
from StringIO import StringIO
# in python 3: from io import StringIO
from PIL import Image
from Django.core.files.base import File
そして、TestCaseクラスに静的メソッドを作成します。
@staticmethod
def get_image_file(name='test.png', ext='png', size=(50, 50), color=(256, 0, 0)):
file_obj = StringIO()
image = Image.new("RGBA", size=size, color=color)
image.save(file_obj, ext)
file_obj.seek(0)
return File(file_obj, name=name)
例:
instance = YourModel(name=value, image=self.get_image_file())
ファイルシステムに実際のファイルを作成したくない場合は、代わりにこの37バイトのGIFを使用できます。これは、コードでバイトリテラルになるのに十分な大きさです。
from Django.core.files.uploadedfile import SimpleUploadedFile
small_gif = (
b'\x47\x49\x46\x38\x39\x61\x01\x00\x01\x00\x00\x00\x00\x21\xf9\x04'
b'\x01\x0a\x00\x01\x00\x2c\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02'
b'\x02\x4c\x01\x00\x3b'
)
uploaded = SimpleUploadedFile('small.gif', small_gif, content_type='image/gif')
私のアプローチは、有用なデータを渡すことを意図せずにモデルをテストする方法です:
from Django.core.files import File
SomeModel.objects.create(image=File(file=b""))
誰かがpython 3.xx
Maxim Panfilovの優れた答えを少し修正して、独立した名前でよりダミーのイメージを作成します。
from io import BytesIO
from PIL import Image
from Django.core.files.base import File
#in your TestCase class:
class TestClass(TestCase):
@staticmethod
def get_image_file(name, ext='png', size=(50, 50), color=(256, 0, 0)):
file_obj = BytesIO()
image = Image.new("RGBA", size=size, color=color)
image.save(file_obj, ext)
file_obj.seek(0)
return File(file_obj, name=name)
def test_upload_image(self):
c= APIClient()
image1 = self.get_image('image.png')
image2 = self.get_image('image2.png')
data =
{
"image1": iamge1,
"image2": image2,
}
response = c.post('/api_address/', data )
self.assertEqual(response.status_code, 201)