2

Django 1.3FileFieldでは、インスタンスが削除されたときに実際のファイルが残るように、モデルの動作が s で変更されました。ほとんどの場合、これで問題ありません。ImageFieldしかし、私はsを多用するアプリケーションをテストしており、開発用アップロード ディレクトリに何百もの無駄な画像が残っています。開発なので大したことではありませんが、テストで後片付けをしたいと思います。

テスト時にこれらの画像がぶら下がらないようにする最善の方法は何ですか? deleteオーバーライドなどを使用して、この動作を全面的に変更したくないため、その部分を強調します。

4

3 に答える 3

2

私は壊れて少し妥協しました。先に進み、オーバーライドされた を使用することにしましたが、 kwargdeleteを渡すことに依存して実際の画像ファイルを削除しました。include_images=True

class Photo(models.Model):
    ...
    def delete(self, *args, **kwargs):
        if kwargs.pop('include_images', False):
            for field in self._meta.fields:
                if type(field) == models.ImageField:
                    image = self.__getattribute__(field.name)
                    if image.name != '':
                        image.storage.delete(image.name)
        super(Photo, self).delete(*args, **kwargs)

次に、tearDownテスト ケースのメソッドを次のように変更しました。

def tearDown(self):
    for p in Photo.objects.all():
        p.delete(include_images=True)

私はこの解決策に完全に満足しているわけではありませんが、私が理想と考えるものに最も近いものです. これは実際にはすべてテスト自体で処理する必要があります。

于 2011-12-08T22:31:07.650 に答える
1

djangoコマンドを呼び出すcron

于 2011-12-08T18:33:23.853 に答える
0

問題があり、Google でこの投稿を見つけました。私は代わりにコマンドを使用することを好みます。そのため、他の人に役立つ可能性のあるコードを次に示します。これは Django 1.4 にありますが、どのバージョンでも動作するはずです。私はWebTestを使用します:

基本テストクラス:

def get_test_image_input(self):
    return (
        '_test-image.jpg',
        file(os.path.join(settings.TEST_FILES_PATH, "images", "test.jpg")).read()
    )

どのテストでも:

form['image'] = self.get_test_image_input()

後でクリーンアップするには、コマンドで_test-imageで始まるすべてのファイルを削除します。

from django.core.management.base import BaseCommand
from fabric.operations import local

class Command(BaseCommand):

    def handle(self, *args, **options):
        # test an app call "tests"
        local("python manage_test.py test tests -v 2")
        # could use call_command(...) instead

        # remove all test images
        local("sudo rm -rf `find . -name _test-image*`")
于 2013-02-22T01:41:41.793 に答える