在每次Django测试之前初始化MEDIA_ROOT

时间:2014-02-17 23:01:57

标签: python django python-unittest

我希望我的Django测试能够创建和修改媒体文件。因此,就像Django测试对数据库一样,我想在每次测试运行之前设置一个空的MEDIA_ROOT文件夹。

我想我会创建一个临时文件夹并指向它的MEDIA_ROOT。但是,我无法弄清楚在哪里放置执行此操作的代码。在this example中,创建了一个特殊的Runner。跑者设置了媒体根并将其撕下来。

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

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

通常我不打扰这个,但忘记调用父setUp方法的成本可能非常高 - 如果有人忘记调用并且测试意外地在实时系统上运行,则会发生不好的事情。 / p>

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

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

1 个答案:

答案 0 :(得分:2)

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

  1. 允许测试在测试人员做正确的事情时独立运行(关于MEDIA_ROOT)(即从测试类继承并调用setUp())。
  2. 让测试人员在意外做错事时不要弄乱实际数据。
  3. 鉴于此,我认为双管齐下的方法是有道理的。您的setUp()解决了问题1.但是,在测试运行器中设置MEDIA_ROOT会隐藏您的测试人员做错了事实。相反,我只关注保护数据:例如,您可以将MEDIA_ROOT设置为None。这将屏蔽MEDIA_ROOT中的实际数据;如果他们不使用您的setUp(),测试人员更有可能看到错误;并减少代码重复。

    更强大的方法是编写自己的测试运行器,在每次测试之前进行设置(以Django处理数据库的方式建模),但这可能对您的需求而言过度。