我希望我的Django测试能够创建和修改媒体文件。因此,就像Django测试对数据库一样,我想在每次测试运行之前设置一个空的MEDIA_ROOT文件夹。
我想我会创建一个临时文件夹并指向它的MEDIA_ROOT。但是,我无法弄清楚在哪里放置执行此操作的代码。在this example中,创建了一个特殊的Runner
。跑者设置了媒体根并将其撕下来。
不幸的是,setup_test_environment
在第一个测试函数运行之前被调用一次,而不是每次运行测试时都会调用。{/ p>
我尝试创建一个FileSystemTestCase
类,在其setUp
函数中设置文件系统,并让我的所有测试用例都来自它。虽然这有效,但它要求每个编写测试用例的人都记得调用我的setUp
方法,因为它不是自动调用的。
通常我不打扰这个,但忘记调用父setUp方法的成本可能非常高 - 如果有人忘记调用并且测试意外地在实时系统上运行,则会发生不好的事情。 / p>
编辑:我发现的临时解决方案是实现两个我自己的跑步者和基地TestCase
。两者都设置了一个临时的MEDIA_ROOT,所以如果有人忘记调用我的setUp
方法,测试将在前一个测试的临时文件夹中运行,或者由跑步者设置。这可能导致测试失败,但不会破坏实时数据。
我希望有一个更优雅的解决方案。
答案 0 :(得分:2)
在我看来,你正试图解决两个不同的问题:
MEDIA_ROOT
)(即从测试类继承并调用setUp()
)。鉴于此,我认为双管齐下的方法是有道理的。您的setUp()
解决了问题1.但是,在测试运行器中设置MEDIA_ROOT
会隐藏您的测试人员做错了事实。相反,我只关注保护数据:例如,您可以将MEDIA_ROOT
设置为None
。这将屏蔽MEDIA_ROOT
中的实际数据;如果他们不使用您的setUp()
,测试人员更有可能看到错误;并减少代码重复。
更强大的方法是编写自己的测试运行器,在每次测试之前进行设置(以Django处理数据库的方式建模),但这可能对您的需求而言过度。