【问题标题】:django testing - confirm that model is unique, depending on another fielddjango testing - 确认模型是唯一的,取决于另一个字段
【发布时间】:2014-06-01 01:38:14
【问题描述】:

我刚刚开始进行 django 测试,所以我仍在努力解决它。

我有两个模型。比如说TopicSubTopic

class Topic(models.Model):
    name = models.CharField(max_length=1, unique=True)

class SubTopic(models.Model):
    topic = ForeignKey(Topic)
    name = models.CharField(max_length=1)

我想设置一个测试用例来检查这是否可能:

topic: 1
    subtopic:a (pk=1)
    subtopic:b (pk=2)
    subtopic:c (pk=3)

topic: 2
    subtopic:a (pk=4)
    subtopic:b (pk=5)
    subtopic:c (pk=6)

但这不可能

topic: 1
    subtopic:a (pk=1)
    subtopic:a (pk=2)
    subtopic:c (pk=3)

我对如何做到这一点的猜测:

def test_subtopics_cant_have_same_name(self):
    topic_1 = Topic.objects.create(name='1')
    suptopic_name = 'a'
    subtopic_1 = SubTopic.objects.create(name=subtopic_name)
    subtopic_2 = SubTopic.objects.create(name=subtopic_name)
    subtopics = [ topic.name for topic in topic.subtopic_set.all()]
    self.assertEqual(subtopics.count(subtopic_name),1)

这是正确的方法吗?

奖金问题

我对解决这个问题的逻辑的猜测是这样的:

class SubTopic(models.Model):
    topic = ForeignKey(Topic)
    name = models.CharField(max_length=1)

    def save(*args, **kwargs):
        subtopics = [ topic.name for topic in topic.subtopic_set.all()]
        if name in subtopics:
            raise IntegrityError('subtopic not unique for this topic')
        else:
            super(SubTopic, self).save(*args, **kwargs)

但我不确定是否有更好的方法..?因为测试现在在检查之前失败。 (保存 subtopic_2 时失败)

【问题讨论】:

    标签: django django-testing


    【解决方案1】:

    您可以使用assertRaises 并捕获IntegrityError

    class MyTestCase(TestCase):
        def test_regular(self):
            topic_1 = Topic.objects.create(name='1')
            topic_2 = Topic.objects.create(name='2')
            for subtopic_name in ['a', 'b', 'c']:
                SubTopic.objects.create(name=subtopic_name, topic=topic_1)
                SubTopic.objects.create(name=subtopic_name, topic=topic_2)
    
            subtopics_1 = [topic.name for topic in topic_1.subtopic_set.all()]
            subtopics_2 = [topic.name for topic in topic_2.subtopic_set.all()]
            self.assertEqual(subtopics_1, subtopics_2, ['a', 'b', 'c'])
    
        def test_uniqueness(self):
            topic_1 = Topic.objects.create(name='1')
            SubTopic.objects.create(name='a', topic=topic_1)
    
            with self.assertRaises(IntegrityError):
                SubTopic.objects.create(name='a', topic=topic_1)
    

    在您设置 unique_together 之前,test_uniqueness 测试将失败:

    class SubTopic(models.Model):
        topic = ForeignKey(Topic)
        name = models.CharField(max_length=1)
    
        class Meta:
            unique_together = ('topic', 'name')
    

    【讨论】:

    • 这样做不会让第一种情况发生。我将编辑我的问题以使其更清楚,我的意图是子主题 1.a2.a 是不同的“a”。
    • @Ben 好的,很抱歉造成误解。我已经编辑了我的答案:我认为您的意思是 unique_togethertopicname 上 - 检查它是否适合您。谢谢。
    猜你喜欢
    • 2021-02-20
    • 2015-09-26
    • 2011-05-21
    • 1970-01-01
    • 2016-01-02
    • 2019-03-11
    • 2010-11-13
    • 2021-09-30
    • 1970-01-01
    相关资源
    最近更新 更多