【问题标题】:Initializing MEDIA_ROOT before each Django Test在每次 Django 测试之前初始化 MEDIA_ROOT
【发布时间】:2014-03-17 10:55:02
【问题描述】:

我想通过我的 Django 测试来创建和修改媒体文件。因此,就像 Django 测试对数据库所做的那样,我想在每个测试运行之前设置一个空的 MEDIA_ROOT 文件夹。

我想我会创建一个临时文件夹并将 MEDIA_ROOT 指向它。但是,我不知道将执行此操作的代码放在哪里。在this example 中,创建了一个特殊的Runner。跑步者设置媒体根并将其拆除。

不幸的是,setup_test_environment 在运行第一个测试函数之前被调用一次,而不是每次运行测试时。

我尝试创建一个FileSystemTestCase 类,该类在其setUp 函数中设置文件系统,并让我的所有测试用例都派生自它。虽然这可行,但它要求每个编写测试用例的人记得调用我的 setUp 方法,因为它不会自动调用。

通常我不会为此烦恼,但是忘记调用父 setUp 方法的代价可能非常高 - 如果有人忘记调用并且测试意外地在实时系统上运行,就会发生不好的事情。

编辑:我发现的临时解决方案是实现 both 我自己的跑步者和基础TestCase。两者都设置了一个临时的 MEDIA_ROOT,所以如果有人忘记调用我的setUp 方法,测试将在上一个测试的临时文件夹中运行,或者是运行者设置的那个。这可能会导致测试失败,但不会破坏实时数据。

我希望有一个更优雅的解决方案。

【问题讨论】:

    标签: python django python-unittest


    【解决方案1】:

    在我看来,您正在尝试解决两个不同的问题:

    1. 当测试人员做正确的事情(即从您的测试类继承并调用您的setUp())时,允许测试独立运行(关于MEDIA_ROOT)。
    2. 防止测试人员在不小心做错事情时弄乱真实数据。

    鉴于此,我认为双管齐下的方法是有意义的。您的setUp() 解决了问题1。但是,在测试运行程序中设置MEDIA_ROOT 隐藏了您的测试人员做错事的事实。相反,我只会专注于保护数据:例如,您可以将 MEDIA_ROOT 设置为 None。这将屏蔽MEDIA_ROOT中的真实数据;如果测试人员不使用您的setUp(),则更有可能看到错误;并减少代码重复。

    一种更强大的方法是编写您自己的测试运行程序,在每次测试之前进行设置(以 Django 处理数据库的方式为模型),但这可能对您的需求有点过头了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-18
      • 1970-01-01
      • 1970-01-01
      • 2016-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多