为什么不是';t Django在测试期间创建空白数据库?
当我运行单元测试时,Django 1.6似乎并没有创建一个空白的数据库来进行测试,我不明白为什么。Django说Django不使用您的生产数据库,而是创建一个单独的空白数据库进行测试。但是,当我调试测试“test\u get\u user\u id”并运行命令“UserProxy.objects.all()”时,我看到了生产数据库中的所有用户。现在我了解到,由于我没有将每个UserProxy实例保存到数据库中,因此没有生成要测试的ID,所以这个特定的测试将失败。但事实仍然是,当我查询UserProxy时,我仍然可以看到生产数据库中的所有用户,我希望这些用户都是空的。为什么会这样 顺便说一句,我正在使用nosetest运行测试:“nosetests-s apps.profile.tests.model\u tests.py:UserProxyUT” 谢谢为什么不是';t Django在测试期间创建空白数据库?,django,django-models,django-testing,Django,Django Models,Django Testing,当我运行单元测试时,Django 1.6似乎并没有创建一个空白的数据库来进行测试,我不明白为什么。Django说Django不使用您的生产数据库,而是创建一个单独的空白数据库进行测试。但是,当我调试测试“test\u get\u user\u id”并运行命令“UserProxy.objects.all()”时,我看到了生产数据库中的所有用户。现在我了解到,由于我没有将每个UserProxy实例保存到数据库中,因此没有生成要测试的ID,所以这个特定的测试将失败。但事实仍然是,当我查询UserPr
# settings.py
DATABASES = {
'default': {
# Enable PostGIS extensions
'ENGINE' : 'django.contrib.gis.db.backends.postgis',
'NAME' : 'myapp',
'USER' : 'myappuser',
'PASSWORD': 'myapppw',
'HOST' : 'localhost',
'PORT' : '',
}
}
# apps/profile/models.py
from django.contrib.auth.models import User
class UserProxy(User):
"""Proxy for the auth.models User class."""
class Meta:
proxy = True
@staticmethod
def get_user_ids(usernames):
"""Return the user ID of each username in a list."""
user_ids = []
for name in usernames:
try:
u = User.objects.get(username__exact=name)
user_ids.append(u.id)
except ObjectDoesNotExist:
logger.error("We were unable to find '%s' in a list of usernames." % name)
return user_ids
# apps/profile/tests/model_tests.py
from django.contrib.auth.models import User
from django.test import TestCase
from apps.profile.models import UserProxy
class UserProxyUT(TestCase):
def test_get_user_ids(self):
debug()
# UserProxy.objects.all() shows usernames from my production database!
u1 = UserProxy(username='user1')
u2 = UserProxy(username='user2')
u3 = UserProxy(username='user3')
usernames = [u1, u2, u3]
expected = [u1.id, u2.id, u3.id]
actual = UserProxy.get_user_ids(usernames)
self.assertEqual(expected, actual)
我想尝试一下,这是因为您使用的是
nosetests
,而不是Django测试运行程序。由于您使用的是nosetests
,因此没有调用Django的setup\u test\u环境
,这意味着代码不知道如何正确使用测试数据库
以下是Django文档的相关部分,这些部分应该会有所帮助:
如果您的代码试图在编译数据库模块时访问数据库,则这将在设置测试数据库之前发生,并可能导致意外结果。例如,如果在模块级代码中有一个数据库查询,并且存在一个真实的数据库,那么生产数据可能会污染测试。无论如何,在代码中包含这样的导入时数据库查询是一个坏主意——重写代码,这样它就不会这样做
以及:
如果要在./manage.py test之外运行测试,例如,从shell提示符运行测试,则需要首先设置测试环境。Django提供了一种方便的方法:
>>> from django.test.utils import setup_test_environment
>>> setup_test_environment()
是否确实没有将生产数据库数据存储为夹具?同时显示
数据库
设置值。谢谢。@alecxe,很抱歉。如图所示。@MikeDeSimone,不,我从不使用夹具。您的测试使用的是不同的设置文件吗?请注意这里应该使用django\u nose
软件包。