首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在django单元测试中使用用户模型的问题

在django单元测试中使用用户模型的问题
EN

Stack Overflow用户
提问于 2010-05-15 22:32:55
回答 3查看 12.4K关注 0票数 21

我有以下django测试用例,它给了我错误:

代码语言:javascript
复制
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启动之前,我得到以下错误:

代码语言:javascript
复制
IntegrityError: column username is not unique

很明显,它试图在每个测试用例之前创建self.u1,并发现它已经存在于数据库中。如何在每个测试用例之后正确地清理它,以便后续的用例能够正确运行?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-05-15 22:35:57

在每个测试用例之前和之后调用单元测试上的setUptearDown方法。定义删除已创建用户的tearDown方法。

代码语言:javascript
复制
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()

我也建议create user profiles使用post_save signal,除非你真的想为每个用户手动创建用户配置文件。

删除评论的后续

来自Django docs

当Django删除一个对象时,它模拟了DELETE CASCADE上的SQL约束的行为--换句话说,任何具有指向要删除的对象的外键的对象都将被删除。

在您的示例中,用户配置文件指向user,因此您应该先删除该用户,然后同时删除该配置文件。

票数 29
EN

Stack Overflow用户

发布于 2012-12-30 00:09:30

如果您希望django在每次测试运行后自动刷新测试数据库,那么您应该扩展django.test.TestCase,而不是像您目前正在做的那样扩展django.utils.unittest.TestCase

在每次测试后转储数据库是一种很好的做法,这样您就可以额外确保测试的一致性,但请注意,由于这种额外的开销,测试的运行速度会变慢。

请参阅"Writing Tests" Django Docs中的WARNING部分。

票数 10
EN

Stack Overflow用户

发布于 2010-05-15 22:35:16

准确地说,setUp之所以存在,就是为了在每个测试用例之前运行一次

逆向方法在每个测试用例之后运行一次,名为tearDown:这是删除self.u1等的地方(假设只调用self.u1.delete(),除非您除了删除对象之外还有补充的专用清理需求)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2840467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档