Django 1.3使用FileField
更改了模型的行为,以便在删除实例时保留实际文件。对于大多数目的,这很好。但是,我正在测试一个大量使用ImageField
的应用程序,而我在开发上传目录中最终会出现数百个无用的剩余图像。由于它的开发,这不是一个大问题,但我更愿意在测试后自己清理。
在测试时,使这些图像不会挂在周围的最佳方法是什么?我强调这一部分是因为我不想全面修改这种行为,使用delete
覆盖等。
答案 0 :(得分:2)
我崩溃了并且妥协了一下。我决定继续使用被覆盖的delete
,但我删除了依赖于传递include_images=True
kwarg的实际图像文件。
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)
我对这个解决方案并不完全满意,但它是我能达到的最接近理想的解决方案。这应该完全由测试本身来处理。
答案 1 :(得分:1)
答案 2 :(得分: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*`")