django测试assertquerysetequal不起作用

时间:2018-12-03 14:22:16

标签: django pytest-django

我试图使用以下命令在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))

1 个答案:

答案 0 :(得分:0)

您没有在比较两个查询集,因此为什么会失败。我不太确定为什么要将查询集与由[repr(r) for r in pitemlist]生成的列表进行比较?只需直接比较两个查询集:

self.assertQuerysetEqual(res.context['object_list'], pitemlist)