使用@override_settings覆盖TEST_RUNNER

时间:2013-12-22 01:01:08

标签: django unit-testing test-runner

为了更快地运行我的测试,我在this answer中创建了一个无数据库测试运行器。然后我需要将TEST_RUNNER设置变量设置为我的新测试运行器,但仅适用于某些测试。为实现这一目标,我尝试使用django.test.utils.override_settings这样的装饰器(如docs中所示):

from django.test import TestCase
from django.test.utils import override_settings

class MyTestCase(TestCase):
    @override_settings(TEST_RUNNER='path_to_my_no_db_test_runner')
    def test_my_test_case(self):
        ...

问题在于,当我运行此测试时,django仍会创建数据库,这当然不是预期的行为。奇怪的是,如果我将TEST_RUNNER直接设置在我的settings.py中,它可以完美地运行,但是django.test.utils.override_settings似乎没有效果。我也尝试使用this override_settings module但得到了相同的结果。

我错了什么?有没有其他方法来实现这一目标?我宁愿不创建test_settings.py并使用--settings参数运行我的测试。

1 个答案:

答案 0 :(得分:2)

将这段代码放入配置中:

TESTING = 'test' in sys.argv

...

if TESTING:
    TEST_RUNNER = 'path_to_my_no_db_test_runner'
    DATABASES = {}

只有在运行测试时才会定义TESTING设置,然后您可以动态更改某些设置,包括数据库,迁移,测试运行程序......

它将在Django初始化的最开始加载,因此如果覆盖DATABASES,则不会创建任何DB。