测试ManyToManyField的最佳方法

时间:2013-04-16 18:42:45

标签: python django

我遇到了为ManyToManyField条目开发测试的问题。我有一个简单的博客模型:

class Tag(models.Model):
    name = models.CharField(max_length=25)

class Entry(models.Model):

    title = models.CharField(max_length=80)
    author = models.ForeignKey(User)
    pubdate = models.DateTimeField()
    tags = models.ManyToManyField(Tag)
    text = models.TextField()

我已经创造了一些非常基本的测试,仅仅是因为它真的很糟糕:

class EntryTests(TestCase):
    def testEntryFields(self):
        user1 = User.objects.create_user('xs', 'ln@gmail.com', 'pw')
        user1.last_name = 'H'
        user1.save()

        now = timezone.now()
        entry1 = Entry(title="Title", author=user1, pubdate=now, text="Hello")
        entry1.save()
        tag1 = entry1.tags.create(name="testtag")
        tag1.save()

        self.assertEqual(entry1.title, "Title")
        self.assertEqual(entry1.pubdate, now)
        self.assertEqual(entry1.text, "Hello")
        self.assertEqual(entry1.author, user1)
        self.assertEqual(entry1.tags.all()[0], tag1)
        self.assertEqual(tag1.name, "testtag")

这传递了,但正如你所看到的,我必须做一些奇怪的体操(生成所有条目的列表并获取该列表中的第一个,也是唯一的条目)来测试{{ 1}}。使用Django有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

我不确定我是否理解您想要测试的内容与django模型的正常行为之间的区别...

但是对于那个断言来说,不是一个简单的字段查找吗?

https://docs.djangoproject.com/en/dev/topics/db/queries/

self.assertEqual(entry1.tags.get(pk=tag1.pk), tag1)

另外,django的unittest中有一些自定义断言: 使用.all.filter

时,assertQuerySetEqual可能更合适