【问题标题】:Unit Test: How To Mock MEDIA_ROOT But Still Access A File That Is Stored In My Normal MEDIA Folder单元测试:如何模拟 MEDIA_ROOT 但仍访问存储在我的普通 MEDIA 文件夹中的文件
【发布时间】:2020-09-18 13:04:21
【问题描述】:

我正在测试我的网页 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 文件夹之外,我还找到了其他解决方案,但它们看起来很老套,而且我更喜欢正确地做这件事,并希望从中吸取教训。

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'))

谢谢。

【问题讨论】:

    标签: django selenium django-testing django-tests


    【解决方案1】:

    问题:

    PDF 文件正在您的 MEDIA_ROOT 文件夹中建立,因为不会自动删除它们。

    推荐解决方案:

    实际上我几个月前就遇到了这个问题,我找到的解决方案是django-cleanup 工具。它非常容易安装并集成到您的应用中(只需将其添加到您的 INSTALLED_APPS 中的 settings.py)。

    注意:这是假设您的 PDF 文件位于您的某个模型的 FileField 中。如果不是这种情况,那么此解决方案将不适合您。

    【讨论】:

    • 谢谢。我会在可以的时候看看,让你知道我的进展情况
    • 我安装了它并将它添加到我安装的应用程序中,但它没有清理我的文件。文档说如果无法检查您的模型是否使用apps.get_models() 加载。我不知道把它放在哪里,虽然我把它放在我的一个models.py的顶部并得到了以下错误raise AppRegistryNotReady("Models aren't loaded yet.") django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.。我已经搜索了这个错误,但修复并没有帮助我。你有什么建议吗?非常感谢
    • 待删除文件对应的模型保存后,应删除文件。您是否尝试在将新的 PDF 文件附加到该模型后调用 .save()?
    • 嗨。我似乎无法弄清楚为什么它不起作用,尽管我确定你的建议很好,而且我只是在某个地方设置了错误的东西。谢谢
    猜你喜欢
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    相关资源
    最近更新 更多