我正在使用Django 1.9并编写了一个自定义测试运行器。我无法弄清楚为什么我的生产数据库被用来代替我的test_数据库。我已经阅读了很多Django文档无济于事。我的生产数据库的名称是zippymeals,所以我的测试数据库应该是test_zippymeals。但是我的测试似乎是针对zippymeals数据库运行的,而不是test_zippymeals。这是我的自定义测试运行器的代码:
class TestRunner(DiscoverRunner):
def __init__(self, pattern=None, top_level=None, verbosity=1, interactive=True, failfast=False, **kwargs):
super(TestRunner, self).__init__(pattern, top_level, verbosity, interactive, failfast, **kwargs)
def setup_databases(self, **kwargs):
bash_cmd = "createdb -T zippymeals_template test_zippymeals"
process = subprocess.Popen(bash_cmd.split(), stdout=subprocess.PIPE)
process.communicate()[0]
def teardown_databases(self, old_config, **kwargs):
bash_cmd = "dropdb test_zippymeals"
process = subprocess.Popen(bash_cmd.split(), stdout=subprocess.PIPE)
process.communicate()[0]
我在settings.py文件中设置了以下内容:
TEST_RUNNER = 'tests.test_runner.TestRunner'
我正在使用PostgreSQL,因此我的自定义测试运行器使用zippymeals_template数据库(这是我的数据库的空结构)来创建一个空的test_zippymeals数据库。 test_zippymeals数据库被创建得很好,它在我运行测试时没有被使用。此外,我尝试过以下操作,但没有运气:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'zippymeals',
'TEST': {
'NAME': 'test_zippymeals'
}
}
}
有谁知道如何从DiscoverRunner继承并确保正在使用test_数据库?
答案 0 :(得分:2)
您需要为setup_databases
调用超类方法,这是负责为测试数据库设置正确别名的方法。 E.g。
def setup_databases(self, **kwargs):
db = super(TestRunner, self).setup_database(**kwargs)
.... # your code goes here
return db
以下是在postgres数据库上运行测试的setup_database方法的更通用版本:
class CustomTestRunner(DiscoverRunner):
def setup_databases(self, **kwargs):
# your code goes here
bash_cmd = "createdb -T zippymeals_template test_zippymeals"
process = subprocess.Popen(bash_cmd.split(), stdout=subprocess.PIPE)
process.communicate()[0]
# force Django to connect to the correct db for tests
connection = db.connections['default']
db_conf = connection.settings_dict
db_conf['NAME'] = db_conf['TEST']['NAME']
connection.connect()