单元测试:如何模拟 MEDIA_ROOT 但仍然访问存储在我的普通 MEDIA 文件夹中的文件

Unit Test: How To Mock MEDIA_ROOT But Still Access A File That Is Stored In My Normal MEDIA Folder

我正在测试我的一个网页 POST 功能。 if 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'))

谢谢。

问题:

PDF 文件正在您的 MEDIA_ROOT 文件夹中累积,因为没有任何内容会自动删除它们。

推荐的解决方案:

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

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