在我的settings.py中,我有这个:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'foo',
'USER': 'foo',
'PASSWORD': 'foo',
'HOST': 'localhost',
},
}
我在我的db上运行了这个SQL:
GRANT ALL ON test_foo.* TO 'foo'@'localhost';
我已经提炼了我试图通过我的测试找出的东西:
from django.test import TestCase
from django.contrib.auth.models import User
class UserTestCase(TestCase):
def test_create_user(self):
user = User.objects.create_user(
username='jacob', email='jacob@bla.net', password='top_secret')
user.save()
user = User.objects.get(username="jacob")
import ipdb; ipdb.set_trace()
self.assertTrue(False)
当我运行测试并点击断点时,我在test_foo中查询auth_user表并且它是空的。
这是为什么?感谢
答案 0 :(得分:3)
Django的TestCase
类使用数据库事务(如果数据库支持它)来加速测试。
这意味着在测试方法中,任何数据库修改只对该测试可见,并且不会提交给数据库。您将无法使用外部工具检查更改。
如果您需要测试来提交对测试数据库的更改,则可以扩展TransactionTestCase
。 E.g。
class UserTestCase(TransactionTestCase):
def test_create_user(self):
# any database changes will be visible in the test database
....
在每个TransactionTestCase
测试结束时,数据库将重置为已知状态。请注意,这将使您的单元测试变慢。再一次,只有支持事务的数据库(例如PostgreSQL,MySQL + InnoDB)才会出现这种行为。
有关详细信息,请参阅https://docs.djangoproject.com/en/1.9/topics/testing/tools/#transactiontestcase。
答案 1 :(得分:0)
https://docs.djangoproject.com/en/1.9/topics/testing/overview/#the-test-database
需要数据库的测试(即模型测试)不会使用您的“真实”(生产)数据库。为测试创建单独的空白数据库。
根据上面链接的文档,默认数据库名称以test_
开头。