我试图使用以下命令在django测试中做一个assertqueryset,但是如果列表中只有一个对象,那么它们都可以工作,但是当我在列表中插入多个对象以比较两组查询时,它们都可以工作有时会失败,有时会通过,这是完全奇怪的(使用同一组代码运行)。我用来测试的assertquerysetequal列表来自How do I test Django QuerySets are equal?和Django 1.4 - assertQuerysetEqual - how to use method中的另外两个问题以及django文档。
这可能是因为序列在比较测试中失败时顺序不正确。因为当我打印时-我的查询集完全匹配。因为当我运行测试时,有时测试会通过,所以当我比较列表中的多个对象时,有时会失败。我可以告诉他们,列表由于错误消息而失败时,列表会有所不同,但是我不明白为什么我使用的命令没有按顺序比较它们。 (他们被接受/推荐答案)
任何有关如何永久解决此问题的建议都将受到欢迎。谢谢。
class TestViews(TestCase):
def setUp(self):
self.client = Client()
self.user = User.objects.create_user(
username='normaluser', email='s@gmail.com', password='secret123')
self.notcreateuser = User.objects.create_user(
username='notcreateuser', email='s@gmail.com', password='secret123')
self.adminuser = User.objects.create_user(
username='adminuser', email='s@gmail.com', password='secret123', is_staff=True)
obj_puser = mixer.blend('users.PUser', user=self.user)
obj_puser_oth = mixer.blend('users.PUser', user=self.notcreateuser)
obj_puser_staff = mixer.blend('users.PUser', user=self.adminuser)
obj_ptype = mixer.blend('polls.Ptype', active=True)
obj_pitem0 = mixer.blend('polls.PollItem', polltype=obj_ptype, user_submit=self.user, allowed=True)
obj_pitem1 = mixer.blend('polls.PollItem', polltype=obj_ptype, user_submit=self.user, allowed=True)
def test_poll_list_view_query(self):
self.client.login(username="normaluser", password="secret123")
ptype_obj = Ptype.objects.get(pk__in=[1])
path = "/polls/"
data = {'type': ptype_obj.slug }
res = self.client.get(path, data)
pitemlist = PollItem.objects.filter(pk__in=[1,2])
#list of assertqueriesequal I am testing
self.assertQuerysetEqual(res.context['object_list'], [repr(r) for r in pitemlist])
self.assertQuerysetEqual(res.context['object_list'], pitemlist, transform=lambda x:x)
self.assertQuerysetEqual(res.context['object_list'], map(repr, pitemlist))
答案 0 :(得分:0)
您没有在比较两个查询集,因此为什么会失败。我不太确定为什么要将查询集与由[repr(r) for r in pitemlist]
生成的列表进行比较?只需直接比较两个查询集:
self.assertQuerysetEqual(res.context['object_list'], pitemlist)