【问题标题】:Initializing MEDIA_ROOT and the Django Storage before each test在每次测试之前初始化 MEDIA_ROOT 和 Django 存储
【发布时间】:2014-02-23 13:45:34
【问题描述】:

正如this question 中所述,我正在尝试隔离在 Django 测试中完成的文件系统更改。

我基本上是在运行测试之前更改settings.MEDIA_ROOT。不幸的是,Django 存储类似乎不受它的影响,因此即使MEDIA_ROOT 指向另一个临时目录,文件也会保存在原始位置。

如何重新初始化 Django 存储系统以反映新的媒体根?

更新:问题是设置文件被预加载到django.conf.Settings 对象中,对settings.MEDIA_ROOT 的任何更改都不会反映在预加载的实例中。我仍然不知道如何克服这个问题。

【问题讨论】:

  • 你在哪里更改 settings.MEDIA_ROOT,在你的测试中,在 yourapp.settings 中?
  • 在我的 Test 类以及 TestRunner 类中。
  • 而且每个文件有不同的MEDIA_ROOT 吗?
  • 没有。有些测试会在同一个 MEDIA_ROOT 下创建多个文件。

标签: python django django-tests


【解决方案1】:

原来我只需要更改这两个设置:

from django.conf import settings as django_settings
from project import settings

django_settings.MEDIA_ROOT = settings.MEDIA_ROOT = '....'

这解决了问题。

也许另一个问题是我没有在整个系统中使用django.conf.settings,而是我自己导入的设置。我会在某个时候改变它。

【讨论】:

    【解决方案2】:

    您可能想在测试中使用 Django 的 built-in feature to override settings。这正是它的设计目的。

    直接来自文档,请注意with self.settings

    from django.test import TestCase
    
    class LoginTestCase(TestCase):
    
        def test_login(self):
    
            # First check for the default behavior
            response = self.client.get('/sekrit/')
            self.assertRedirects(response, '/accounts/login/?next=/sekrit/')
    
            # Then override the LOGIN_URL setting
            with self.settings(LOGIN_URL='/other/login/'):
                response = self.client.get('/sekrit/')
                self.assertRedirects(response, '/other/login/?next=/sekrit/')
    

    【讨论】:

    • 哦,这似乎是个好主意!我将在我的 setUp() 方法中添加它并在 tearDown() 中清理!
    • @zmbq 小心,这是一个context manager,所以它不适用于setUptearDown。对settings 的更改仅在您“在缩进块内”时才有效。
    • 我很确定我可以在 setUp 中调用 self.settings(...),保存生成的上下文并在 tearDown 中将其关闭。但是,这还不够,因为我在原始问题中提到的问题 - 我还需要更改测试运行器的 MEDIA_ROOT,以避免人们忘记调用 setUp 时出现问题。
    猜你喜欢
    • 2014-03-17
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-29
    • 1970-01-01
    • 2016-11-10
    相关资源
    最近更新 更多