django - 单元测试 : How To Mock MEDIA_ROOT But Still Access A File That Is Stored In My Normal MEDIA Folder

标签 django selenium django-testing django-tests

我正在测试我的一个网页 POST 功能。 if request.method == 'POST'它生成一个 pdf 并将其附加到用户。每次我运行测试时,我都会生成在我的 MEDIA 文件夹中构建的 pdf 文件,我必须手动删除它们。我决定寻找防止这种情况发生的方法,在我看来最好的方法是用临时文件覆盖我的 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 文件夹之外,我还找到了其他解决方案,但它们看起来很笨拙,我更喜欢正确地执行此操作,并希望从中学习。

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

谢谢你。

最佳答案

问题:

PDF 文件正在您的 MEDIA_ROOT 文件夹中建立,因为没有任何东西会自动删除它们。

推荐解决方案:

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

注:这是假设您的 PDF 文件位于 FileField您的模型之一。如果情况并非如此,那么此解决方案对您不起作用。

关于django - 单元测试 : How To Mock MEDIA_ROOT But Still Access A File That Is Stored In My Normal MEDIA Folder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62111736/

相关文章:

Django 求和另一列中 'group by' 之后的列的值

selenium - 以另一种方式检查 'checkBox' -> xPath

java - 奇怪的错误 : Error:(20, 55) java: void 不能用 selenium 取消引用

python - selenium.common.exceptions.WebDriverException : Message: invalid session id using Selenium with ChromeDriver and Chrome through Python

python - Django:测试加载静态文件是否成功

python - AppEngine(或者可能在 Django 中)是否有称为 insert_or_update 的快捷方法?为什么不?

python - 如何在 Django 通用 ListView 类中使用 slugfield 创建链接?

django - Django 中的条件分页_按数字

python - Django 测试 : no data in temporary database file

python - Django REST 框架 : TestCase is not returning correct queryset