Python django单元测试中使用用户模型的问题
我有以下django测试用例,它给了我错误:Python django单元测试中使用用户模型的问题,python,django,unit-testing,django-testing,Python,Django,Unit Testing,Django Testing,我有以下django测试用例,它给了我错误: class MyTesting(unittest.TestCase): def setUp(self): self.u1 = User.objects.create(username='user1') self.up1 = UserProfile.objects.create(user=self.u1) def testA(self): ... def testB(self)
class MyTesting(unittest.TestCase):
def setUp(self):
self.u1 = User.objects.create(username='user1')
self.up1 = UserProfile.objects.create(user=self.u1)
def testA(self):
...
def testB(self):
...
当我运行测试时,testA
将成功通过,但在testB
开始之前,我得到以下错误:
IntegrityError: column username is not unique
很明显,它试图在每个测试用例之前创建
self.u1
,并发现它已经存在于数据库中。如何让它在每个测试用例之后正确地进行清理,以便后续的用例能够正确运行?确切地说,setUp
的存在就是为了在每个测试用例之前运行一次
相反的方法,即在每个测试用例之后运行一次的方法,被命名为tearDown
:在这里您可以删除self.u1
等(可能只需调用self.u1.delete()
,除非您除了删除对象之外还有额外的专门清理要求)在每个测试用例之前和之后都会调用Unittests上的方法。定义删除已创建用户的方法
class MyTesting(unittest.TestCase):
def setUp(self):
self.u1 = User.objects.create(username='user1')
self.up1 = UserProfile.objects.create(user=self.u1)
def testA(self):
...
def tearDown(self):
self.up1.delete()
self.u1.delete()
我还建议使用signal,除非您真的想为每个用户手动创建用户配置文件
关于删除评论的后续行动:
发件人:
当Django删除一个对象时,它
模拟SQL语句的行为
对DELETE-CASCADE的约束
换句话说,任何有
指向要创建的对象的外键
将被删除将与
它
在您的情况下,用户配置文件指向用户,因此您应该首先删除该用户以同时删除该配置文件。如果您希望django在每个测试运行后自动刷新测试数据库,那么您应该扩展
django.test.TestCase
,而不是django.utils.unittest.TestCase
(如您当前所做)
在每次测试之后转储数据库是一种很好的做法,这样可以额外确保测试的一致性,但请注意,测试的运行速度会因为额外的开销而变慢
请参阅中的“警告”部分。谢谢!我现在遇到的问题是,当我删除up1时,删除不会层叠并删除u1,即使我已经将User指定为UserProfile的外键。e、 g.
user=models.ForeignKey(user,unique=True)
实际上,您应该删除该用户,以便一次性级联和删除用户配置文件,或者您可以先删除用户配置文件,然后再删除用户。呸。。。我不是在文档中读到的,但出于某种原因,我对外键指向的方向感到困惑……您不应该使用create()来创建用户。而是使用新的create_user()方法。这将正确地散列密码。详情如下: