Django 2测试用例assertQuerysetEqual

Django 2测试用例assertQuerysetEqual,django,Django,也许我误解了assertQuerysetEqual的实现,但我正在尝试构建一个测试来验证我的模型

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

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)

有几件事不对:

  • setUpTestData
    类的命名不正确(您有
    setUpTestData
  • 创建列表的语法错误;它应该是
    [a,b,c,d]
    ,而不是
    列表(a,b,c,d)
    ,这是
    类型错误
  • 最重要的是,
    assertquerystequal
    ,默认情况下,使用
    repr
    获取queryset中值的表示形式。在您的情况下,如果您:

  • 您可以对每个对象调用
    repr
    ,这样它们将匹配
    assertquerystequal
    将执行的操作


    最后一个注意事项:如果排序是通过
    id
    ,那么测试也会通过。如果我是你的话,我会以不同的顺序创建对象,这样你就更有信心,测试的是按名称排序。或者,您可以通过名称而不是
    pk
    ,来获取对象,作为一种自我记录测试的方式,使排序变得明显。

    显然,我有更大的问题。我想把它标记为一个答案,但我读错了我的测试错误信息。[链接]()问题似乎是一样的,实际上,您仍然拼错了
    setUpTestData
    (大写U)。
    expected_qs = map(repr, [test_name_1, test_name_2, test_name_3, test_name_4])