Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django单元测试中使用用户模型的问题_Python_Django_Unit Testing_Django Testing - Fatal编程技术网

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

我有以下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):
        ...
当我运行测试时,
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()方法。这将正确地散列密码。详情如下: