Django - 在应用程序正常工作时无法运行测试

时间:2013-02-25 06:51:42

标签: django django-models automated-tests

问题:

问题是我有一个工作正常的应用程序,但是当我尝试使用命令运行测试时:

 coverage run manage.py test --settings=crm.settings.test

在开始时出现错误:

Creating test database for alias 'default'...
IntegrityError: profiles_usermodel.current_project_id may not be NULL

以前我跑过测试,一切都很顺利。然后我显着改变了模型和应用程序并尝试运行测试 - 结果我得到了上面提到的问题。我做错了什么?

我的设置:

我有单独的测试设置:

My_application
|___My_application
    |___urls.py
    |___ __init__.py
    |___wsgi.py
    |___settings
        |___base.py
        |___test.py
        |___local.py
|___profiles
    |___models.py
    |___views.py
    |___tests
        |___ __init__.py
        |___models.py

测试设置如下:

"""Local test settings and globals which allows us to run our
test suite locally."""
from .base import *

########## TEST SETTINGS
TEST_RUNNER = 'discover_runner.DiscoverRunner'
TEST_DISCOVER_TOP_LEVEL = PROJECT_ROOT
TEST_DISCOVER_ROOT = PROJECT_ROOT
TEST_DISCOVER_PATTERN = "*"

########## IN-MEMORY TEST DATABASE
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.sqlite3",
        "NAME": ":memory:",
        "USER": "",
        "PASSWORD": "",
        "HOST": "",
        "PORT": "",
    },
}

INSTALLED_APPS += ('coverage',)

还有来自My_application/profiles/models.py的模型(省略了几个字段和方法):

from django.db import models
from django.contrib.auth.models import (
        BaseUserManager, AbstractBaseUser, PermissionsMixin )
from django.contrib.auth.models import Group


class Project(models.Model):
    name = models.CharField(max_length=255)


class UserModel(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(max_length=255, unique=True, db_index=True,)
    current_project = models.ForeignKey(Group, related_name='usermodel_current')

    USERNAME_FIELD = 'email'

我也使用South进行数据库迁移和django 1.5c2。

1 个答案:

答案 0 :(得分:0)

错误很明显。

测试运行器正在尝试创建数据库,并将记录插入“profiles_usermodel”。此插入失败,因为字段'current_project'不能为null,但创建过程没有在该字段中设置任何内容。

我们必须看到你的测试,以准确缩小发生的位置。

如果您不关心让它正常工作并且只是希望它能够正常工作,请更新您的用户模型,并将null=True添加到UserModel.current_project的kwargs。