python – 在每个Django测试之前初始化MEDIA_ROOT

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

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

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

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

通常我不打扰这个,但是忘记调用父setUp方法的成本可能非常高 – 如果有人忘记了调用并且测试是在实时系统上意外运行的,那么就会发生不好的事情.

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

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

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

>当测试人员做正确的事情时(即从测试类继承并调用setUp()),允许测试独立运行(关于MEDIA_ROOT).
>让测试人员在意外做错事时不要弄乱实际数据.

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

一个更强大的方法是编写自己的测试运行器,在每次测试之前进行设置(以Django处理数据库的方式建模),但这可能对你的需求有些过分.

点赞