我想测试一些使用User对象的东西。
但由于某种原因,我得到了:
IntegrityError: column user_id is not unique
我现在已经把头撞到了墙上一段时间了,似乎我无法弄清楚出了什么问题。起初我以为可能数据库没有在测试之间刷新,但是我跟踪了User.objects.all()并且它是一个空列表。
这是测试:
from django.contrib.auth.models import User
from django.test import TestCase
class TestSomething(TestCase):
def test_create_user(self):
User.objects.create_user('foo', 'foo@bar', 'bar')
我的测试设置:
from settings import *
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': ':memory:',
}
}
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
更新
我应该更好地阅读我的strack痕迹。它实际上是导致问题的以下信号。
@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
if created:
Profile(user=instance).save()
答案 0 :(得分:6)
我通过调整我的信号解决了这个问题:
from django.dispatch import receiver
@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.get_or_create(user=instance)
这解决了症状,但不是真正的原因。我认为将正常测试与Django测试混合会在某处导致错误。当我单独在我的问题中运行测试时,它会起作用。
如果我没有得到其他答案,我会将此标记为正确。
答案 1 :(得分:4)
我遇到了同样的问题并且有一个简单的解决方法。如果运行'manage.py dumpdata'并且数据库中已有UserProfile,则会出现此问题。 UserProfile将位于json文件中,因此当您加载测试数据夹并尝试在测试中使用相同的用户名创建新的UserProfile时,您将收到冲突,因为已存在与该用户的UserProfile。解决方案是从json fixture中删除UserProfile。
所以,举个例子:
希望有所帮助。
答案 2 :(得分:1)
我想你在Profile模型中有user_id
字段有唯一约束,不是吗?
您似乎正在尝试在代码中的其他位置保存与相同User对象相关的Profile。 get_or_create
快捷方式可以正常工作,因为只有在数据库中没有这样的对象时才会创建新对象。否则返回现有对象。另一方面,Profile()。save()只是尝试保存对象,如果不可能则引发异常。
对你有意义吗?