单元测试:如何模拟 MEDIA_ROOT,但仍然可以访问存储在我的常规 MEDIA 文件夹中的文件

5

我正在测试我的一个网页的POST功能。当request.method == 'POST'时,它会生成一个PDF文件并将其附加到用户上。每次运行测试时,我都会生成PDF文件,这些文件会一直积累在我的MEDIA文件夹中,我不得不手动删除它们。我决定寻找防止这种情况发生的方法,对我而言最好的方式似乎是用临时文件覆盖我的MEDIA_ROOT。

我遇到了以下错误信息

FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\Acer\\AppData\\Local\\Temp\\profile_pics\\default.jpg'

我确定这是因为在运行测试之前必须创建和登录用户(我不想在设置中执行此操作,因为我必须为不同的测试生成不同类型的用户)。每次创建用户时,他们的个人资料图片都设置为profile_pics\\default.jpg'

我的理解是模拟的MEDIA_ROOT为空,并且不包含默认的个人资料图片,因此会抛出错误。

我的问题是如何绕过这个问题(最好是模拟default.jpg图片)?我发现除了模拟MEDIA_ROOT文件夹之外,还有其他解决方案,但它们似乎非常繁琐,我希望能够正确地处理它,并从中学习。

tests.py

from django.test import override_settings
import tempfile

@override_settings(MEDIA_ROOT=tempfile.gettempdir())
def test_redirects_after_POST(self):
    user = User.objects.create_superuser('username')
    self.client.force_login(user)

    response = self.client.post(
        reverse('final_question'), data={
        'answer': 'this has me totally stumped'}
    )

    self.assertRedirects(response, reverse('page_2'))

谢谢。

1个回答

3

问题:

您的MEDIA_ROOT文件夹中积累了PDF文件,因为没有自动删除它们。

推荐解决方案:

实际上我几个月前遇到了这个问题,我所找到的解决办法是使用django-cleanup工具。它非常容易安装和集成到您的应用程序中(只需将其添加到settings.py中的INSTALLED_APPS即可)。

注意: 这假设您的PDF文件在您的模型的一个FileField中。如果不是这种情况,那么这个解决方案对您无效。


谢谢。我会在有时间的时候查看并告诉您我的进展。 - horse
我安装了它并将其添加到我的已安装应用程序中,但它没有清理我的文件。文档说如果它不起作用,请检查您的模型是否使用apps.get_models()加载。虽然我不确定在哪里放置它,但我将其放在了我的models.py的顶部,并得到了以下错误raise AppRegistryNotReady("Models aren't loaded yet.") django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.。我搜索了这个错误,但修复方法没有帮助我。你有什么建议吗?非常感谢。 - horse
当与待删除文件对应的模型被保存时,它应该删除文件。您尝试过在将新的PDF文件附加到该模型后调用.save()吗? - ketcham
嗨。我似乎无法弄清楚为什么它不起作用,尽管我相信您的建议是正确的,但我可能在某个地方设置有误。谢谢。 - horse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接