2022-03-17 TIL



Djangoを使用してImagefieldを使用したモデルのテストコードを記述する際に多くの問題が発生しました.

1.画像ファイルのテスト方法が分からない


Imagefieldのテスト方法を検索することで、次のソリューションを見つけました.
from django.core.files.uploadedfile import SimpleUploadedFile
newPhoto.image = SimpleUploadedFile(name='test_image.jpg', content=open(image_path, 'rb').read(), content_type='image/jpeg')
ソース:https://stackoverflow.com/questions/26298821/django-testing-model-with-imagefield

2.イメージファイルが異なる


適用後にテストを行ったが、次は故障し、正常に動作しなかった.
AssertionError: <ImageFieldFile: logo_kQhWinh.png> != <SimpleUploadedFile: logo.png (image/png)>
理由を知る過程で、倉庫にメディアファイルをアップロードすると、ファイル名が重複するとファイルとして保存されることが分かったので、ファイルリポジトリをチェックすると、大量の画像が見つかりました.
そのため、最初はそれを使って解決しようとしたが、重複したアップロードは解決されなかった.
@override_settings(MEDIA_ROOT=tempfile.gettempdir())
ソース:https://swapps.com/blog/testing-files-with-pythondjango/
だからこれからはこれで解決したいと思います.この場合、テストによって新しいフォルダを作成する際の画像ファイルの違いのエラーが解決されます.
@override_settings(MEDIA_ROOT=tempfile.TemporaryDirectory(prefix='mediatest').name) 
ソース:https://stackoverflow.com/questions/25792696/automatically-delete-media-root-between-tests
しかしtempfileが増えているため、削除する方法を探すことにした.
from django.test import override_settings
import shutil
TEST_DIR = 'test_data'
class SomeTests(TestCase):
    ...
    # use the `override_settings` decorator on 
    # those methods where you're uploading images
    @override_settings(MEDIA_ROOT=(TEST_DIR + '/media'))
    def test_file_upload(self):
        ...
        # your code
        ...
...
# then create a tearDownModule function
# to remove the `TEST_DIR` folder at the 
# end of tests
def tearDownModule():
    print "\n Deleting temporary files..."
    try:
        shutil.rmtree(TEST_DIR)
    except OSError:
        pass
ソース:https://bhch.github.io/posts/2018/12/django-how-to-clean-up-images-and-temporary-files-created-during-testing/
テストに使用するフォルダを指定すると、テストを実行するたびに実行され、すべてのメディアファイルを消去する方法でファイルのスタックを防止します.