【问题标题】:django testing Assertquerysetequal not workingdjango 测试 Assertquerysetequal 不起作用
【发布时间】:2019-05-04 20:43:10
【问题描述】:

我尝试使用以下命令对 django 进行assertQuerysetEqual 测试,但如果列表中只有一个对象,它们都可以工作,但是当我在列表中插入多个对象以比较两组查询时其中有时会失败,有时会通过,这完全奇怪(使用同一组代码运行)。我用来测试的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 assertQuerysetEqual 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))

【问题讨论】:

    标签: django pytest-django


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复。我不能直接比较两个查询集,因为它们的格式不同,一个被撇号包围,另一个没有,而另一个在项目之间有逗号,另一个没有,这就是我尝试其他的原因 - AssertionError:列表不同:[''] != []
    猜你喜欢
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 2013-06-09
    • 1970-01-01
    • 2011-02-06
    • 2012-06-08
    相关资源
    最近更新 更多