Django 2 TestCase assertQuerysetEqual

时间:2018-04-08 21:33:18

标签: django

也许我误解了assertQuerysetEqual的实现,但我正在尝试构建一个测试,以验证我的model meta ordering是否按预期工作。在我找到的所有信息中,我认为这就是我应该做的:

models.py

class Name(models.Model):
    first_name = models.CharField(
        "First Name",
        max_length=100,
        )
    middle_name = models.CharField(
        "Middle Name or Initial",
        max_length=100,
        default='',
        )
    last_name = models.CharField(
        "Last Name",
        max_length=200,
        )

    class Meta:
        ordering = ['last_name', 'first_name', 'middle_name']

tests.py

from django.test import TestCase

from .models import Name


class NameModelTest(TestCase):
    @classmethod
    def setupUpTestData(cls):
        # test_name_1
        Name.objects.create(
        first_name='Anny',
        middle_name='Ann',
        last_name='Anvil',
        )
        # test_name_2
        Name.objects.create(
            first_name='Anny',
            middle_name='B',
            last_name='Anvil',
            )
        # test_name_3
        Name.objects.create(
            first_name='Banny',
            last_name='Anvil',
            )
        # test_name_4
        Name.objects.create(
            first_name='Banny',
            last_name='Banvil',
            )

    def test_meta_ordering_last_first_middle(self):
        test_name_1 = Name.objects.get(pk=1)
        test_name_2 = Name.objects.get(pk=2)
        test_name_3 = Name.objects.get(pk=3)
        test_name_4 = Name.objects.get(pk=4)

        expected_qs = list(test_name_1, test_name_2,
                        test_name_3, test_name_4
                        )

        test_qs = Name.objects.all()

        self.assertQuerysetEqual(test_qs, expected_qs)

1 个答案:

答案 0 :(得分:1)

有一些问题:

  1. setUpTestData类名称不正确(您有setupUpTestData
  2. 您创建列表的语法错误;它应该是[a, b, c, d],而不是list(a, b, c, d),这是TypeError
  3. 最重要的是,assertQuerysetEqual默认情况下使用repr来获取查询集中值的表示。在你的情况下,如果你这样做,它将起作用:
  4. expected_qs = map(repr, [test_name_1, test_name_2, test_name_3, test_name_4])
    

    您在每个对象上调用repr,以便它们与assertQuerysetEqual将会匹配的内容相匹配。

    最后一点说明:如果排序是id,您的测试也会通过。如果我是你,我会以不同的顺序创建对象,因此您更有信心这是正在测试的名称排序。或者你可以通过名称来获取对象,而不是pk,作为一种自我记录测试的方式,使得排序明显。