Django Unitest:Table 不存在
Django Unitest: Table doesn't exist
我创建了一个像这样的简单测试用例:
from unittest import TestCase
import user_manager
class UserTest(TestCase):
def test_register(self):
email = "dung7@gmail.com"
password = "123456"
result, user = user_manager.setup_new_user(email, password)
self.assertEqual(result, CodeID.SUCCESS)
然后我运行测试用例:
python manage.py test users
这是日志:
Creating test database for alias 'default'...
/Users/admin/Projects/MyApp/venv/lib/python2.7/site-packages/django/db/backends/mysql/base.py:112: Warning: Table 'mysql.column_stats' doesn't exist
return self.cursor.execute(query, args)
Creating test database for alias 'myapp_log'...
.FE
======================================================================
ERROR: test_register (users.tests.UserTest)
----------------------------------------------------------------------
Traceback (most recent call last):
...
ProgrammingError: (1146, "Table 'test_myapp.user' doesn't exist")
所以它创建了一个测试数据库,但似乎没有创建 tables。这是我的数据库设置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': "myapp",
'USER': "root",
'PASSWORD': "",
'HOST': '127.0.0.1',
'PORT': '',
},
'myapp_log': {
'ENGINE': 'django.db.backends.mysql',
'NAME': "myapp_log",
'USER': "root",
'PASSWORD': "",
'HOST': '127.0.0.1',
'PORT': '',
},
}
还有我的模特:
class User(BaseModel):
uid = models.IntegerField(primary_key=True)
email = models.CharField(max_length=200)
password = models.CharField(max_length=200)
create_time = models.IntegerField()
update_time = models.IntegerField()
status = models.IntegerField()
social_token = models.CharField(max_length=200)
social_app = models.IntegerField()
class Meta:
db_table = 'user'
有人知道为什么没有创建 table 'user' 吗?
更新:
我的测试用例中的 user_manager 将执行一些查询并在 table 用户上添加新记录。
我想当我 运行 测试用例时,Django 会以某种方式读取我的模型并创建一个测试数据库,其中包含来自这些模型的所有 table。我说得对吗?
您的测试数据库需要与生产数据库不同。一旦测试用例 运行,测试数据库就会被销毁。在您的情况下,未创建数据库。您应该阅读此文档以获取详细信息 https://docs.djangoproject.com/en/1.10/topics/testing/overview/
您还可以添加 user_manager 模块
的片段吗
所以我发现我需要将 models.py 放在我的用户文件夹中,并将 'users' 添加到 INSTALL_APPS 设置中。现在它起作用了。
我创建了一个像这样的简单测试用例:
from unittest import TestCase
import user_manager
class UserTest(TestCase):
def test_register(self):
email = "dung7@gmail.com"
password = "123456"
result, user = user_manager.setup_new_user(email, password)
self.assertEqual(result, CodeID.SUCCESS)
然后我运行测试用例:
python manage.py test users
这是日志:
Creating test database for alias 'default'...
/Users/admin/Projects/MyApp/venv/lib/python2.7/site-packages/django/db/backends/mysql/base.py:112: Warning: Table 'mysql.column_stats' doesn't exist
return self.cursor.execute(query, args)
Creating test database for alias 'myapp_log'...
.FE
======================================================================
ERROR: test_register (users.tests.UserTest)
----------------------------------------------------------------------
Traceback (most recent call last):
...
ProgrammingError: (1146, "Table 'test_myapp.user' doesn't exist")
所以它创建了一个测试数据库,但似乎没有创建 tables。这是我的数据库设置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': "myapp",
'USER': "root",
'PASSWORD': "",
'HOST': '127.0.0.1',
'PORT': '',
},
'myapp_log': {
'ENGINE': 'django.db.backends.mysql',
'NAME': "myapp_log",
'USER': "root",
'PASSWORD': "",
'HOST': '127.0.0.1',
'PORT': '',
},
}
还有我的模特:
class User(BaseModel):
uid = models.IntegerField(primary_key=True)
email = models.CharField(max_length=200)
password = models.CharField(max_length=200)
create_time = models.IntegerField()
update_time = models.IntegerField()
status = models.IntegerField()
social_token = models.CharField(max_length=200)
social_app = models.IntegerField()
class Meta:
db_table = 'user'
有人知道为什么没有创建 table 'user' 吗?
更新:
我的测试用例中的user_manager 将执行一些查询并在 table 用户上添加新记录。
我想当我 运行 测试用例时,Django 会以某种方式读取我的模型并创建一个测试数据库,其中包含来自这些模型的所有 table。我说得对吗?
您的测试数据库需要与生产数据库不同。一旦测试用例 运行,测试数据库就会被销毁。在您的情况下,未创建数据库。您应该阅读此文档以获取详细信息 https://docs.djangoproject.com/en/1.10/topics/testing/overview/ 您还可以添加 user_manager 模块
的片段吗所以我发现我需要将 models.py 放在我的用户文件夹中,并将 'users' 添加到 INSTALL_APPS 设置中。现在它起作用了。