单元测试:如何模拟MEDIA_ROOT,但仍能访问存储在正常MEDIA文件夹中的文件?

问题描述 投票:1回答:1

我正在测试我的一个网页的POST功能。if request.method == 'POST' 它生成一个pdf文件并将其附加给用户。每次我运行测试时,我都会生成pdf文件,这些文件在我的MEDIA文件夹中堆积,我不得不手动删除它们。我决定寻找防止这种情况发生的方法,在我看来最好的方法是用tempfile覆盖我的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是空的,而且不包含默认的profile图片,所以会抛出错误。

我的问题是,我怎样才能规避这个问题(最好是嘲讽默认的.jpg图片)?除了嘲弄MEDIA_ROOT文件夹,我还找到了其他的解决方案,但它们看起来很黑,我更希望能正确地做,并希望能从中学习。

测试.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'))

谢谢你。

django selenium django-testing django-tests
1个回答
3
投票

这个问题。

PDF文件堆积在你的MEDIA_ROOT文件夹中,因为没有任何东西可以自动删除它们。

推荐的解决方案。

其实几个月前我自己也遇到过这个问题,我找到的解决方案是: django-cleanup 工具。它非常容易安装并集成到您的应用程序中(只需将其添加到您的 INSTALLED_APPSsettings.py).

请注意。 这是假设你的PDF文件是在一个叫 FileField 的一个模型。如果不是这种情况,那么这个解决方案就不会对您有用。

© www.soinside.com 2019 - 2024. All rights reserved.