我想测试使用User对象的东西.
但由于某些原因,我得到:
IntegrityError: column user_id is not unique
Run Code Online (Sandbox Code Playgroud)
我一直在撞墙一段时间,似乎我无法弄清楚出了什么问题.起初我以为可能数据库没有在测试之间刷新,但是我跟踪了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')
Run Code Online (Sandbox Code Playgroud)
我的测试设置:
from settings import *
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': ':memory:',
}
}
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
Run Code Online (Sandbox Code Playgroud)
更新:
我应该更好地阅读我的strack痕迹.它实际上是导致问题的以下信号.
@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
if created:
Profile(user=instance).save()
Run Code Online (Sandbox Code Playgroud)
我通过调整我的信号解决了这个问题:
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)
Run Code Online (Sandbox Code Playgroud)
这解决了症状,但不是真正的原因.我认为将正常测试与Django测试混合会在某处导致错误.当我单独在我的问题中运行测试时,它会起作用.
如果我没有得到其他答案,我会将此标记为正确.
我遇到了同样的问题,有一个简单的解决方法。如果您运行 'manage.py dumpdata' 并且您的数据库中已经有一个 UserProfile,则会出现问题。UserProfile 将在 json 文件中,因此当您加载测试数据夹具并尝试在测试中使用相同的用户名创建新的 UserProfile 时,您将遇到冲突,因为该用户的 UserProfile 已经存在。解决方案是从 json 夹具中删除 UserProfile。
所以,作为一个例子:
希望有帮助。
| 归档时间: |
|
| 查看次数: |
16336 次 |
| 最近记录: |