也许我误解了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)
答案 0 :(得分:1)
有一些问题:
setUpTestData
类名称不正确(您有setupUpTestData
)[a, b, c, d]
,而不是list(a, b, c, d)
,这是TypeError
。assertQuerysetEqual
默认情况下使用repr
来获取查询集中值的表示。在你的情况下,如果你这样做,它将起作用:expected_qs = map(repr, [test_name_1, test_name_2, test_name_3, test_name_4])
您在每个对象上调用repr
,以便它们与assertQuerysetEqual
将会匹配的内容相匹配。
最后一点说明:如果排序是id
,您的测试也会通过。如果我是你,我会以不同的顺序创建对象,因此您更有信心这是正在测试的名称排序。或者你可以通过名称来获取对象,而不是pk
,作为一种自我记录测试的方式,使得排序明显。