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])