【问题标题】:Django Unitest: Table doesn't existDjango Unitest:表不存在
【发布时间】:2016-10-15 14:29:39
【问题描述】:

我创建了一个这样的简单测试用例:

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")

所以它创建了一个测试数据库,但似乎它没有创建表。这是我的数据库设置:

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'

有人知道为什么没有创建表“用户”吗?

更新:

我的测试用例中的user_manager 将做一些查询并在表用户上添加新记录。

我认为当我运行测试用例时,Django 会以某种方式读取我的模型并使用这些模型中的所有表创建一个测试数据库。我说得对吗?

【问题讨论】:

    标签: python mysql django django-unittest


    【解决方案1】:

    所以我发现我需要将我的 models.py 放在我的用户文件夹中,并将“用户”添加到 INSTALL_APPS 设置中。现在它起作用了。

    【讨论】:

      【解决方案2】:

      您的测试数据库需要不同于生产数据库。一旦运行测试用例,测试数据库就会被销毁。在您的情况下,未创建数据库。您应该阅读此文档以获取详细信息https://docs.djangoproject.com/en/1.10/topics/testing/overview/ 你能不能也添加你的user_manager模块的sn-p

      【讨论】:

      • 我的 user_manager 做一些查询并在表 User 上添加新记录。所以我应该创建一个新的数据库只是为了测试,我认为 django 会以某种方式读取我的模型,创建数据库并在完成后销毁?
      • 在您的测试文件中,您需要导入您想要使用的模型,然后定义一个设置方法,您可以在其中创建模型实例,然后定义您的断言
      • 我发现我需要在我的 app 文件夹中添加我的 models.py 文件,并创建了表。感谢您的帮助@VaibhavSingh
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-23
      • 2015-02-19
      • 1970-01-01
      • 2019-09-15
      • 1970-01-01
      相关资源
      最近更新 更多