首页 > 解决方案 > django测试给出异常结果

问题描述

在测试 2 个不同的视图时,我得到了奇怪的结果。它们都是列表视图。第一个应该只显示活动订单(active=True),第二个只显示历史视图(completed=True)。我也使用 postgresql 作为数据库。问题是这两个视图在浏览器中都可以正常工作,但是在测试 pytest 时会引发错误,指出不应该列出的订单已列出。

意见如下:

class OrderHistoryView(LoginRequiredMixin, ListView):
    template_name = 'orders/order_history.html'

    def get_queryset(self):
        user = self.request.user
        qs = Order.objects.filter(Q(buyer=user, completed=True)|Q(seller=user, completed=True))
        return qs


class OrderListView(LoginRequiredMixin, ListView):
    template_name = 'orders/order_list_view.html'

    def get_queryset(self):
        user = self.request.user
        qs = Order.objects.filter(Q(buyer=user, active=True)|Q(seller=user, active=True))
        return qs

测试是:

class OrderHistoryViewTests(TestCase):
    @classmethod
    def setUp(self):
        self.req = RequestFactory()
        self.user = mixer.blend('user.CustomUser', email='test@test.com', password='1234')
        self.user2 = mixer.blend('user.CustomUser')
        self.advert = mixer.blend('advert.Advert', author=self.user)
        self.offer = mixer.blend(
            'offer.Offer', advert=self.advert, author=self.user2, receiver=self.user, accepted=True)
        self.order = mixer.blend(
            'orders.Order', advert=self.advert, seller=self.user2, buyer=self.user, offer=self.offer,
            pending=True, completed=True, active=True, disputed=False, cancelled=False)
        self.order2 = mixer.blend('orders.Order', completed=False, buyer=self.user)

    def test_only_shows_completed(self):
        request = self.req.get('/')
        request.user = self.user

        resp = OrderHistoryView.as_view()(request)   
        self.assertContains(resp, self.order)
        self.assertNotContains(resp, order2)

第二个测试完全一样,只是测试它只显示活跃订单

错误信息是:

FAILED orders/tests/test_views.py::OrderHistoryViewTests::test_only_shows_completed - AssertionError: 3 != 0 : Response should not contain '10'
FAILED orders/tests/test_views.py::OrderListViewTests::test_order_listing_showing_only_active - AssertionError: 2 != 0 : Response should not contain '15'

编辑:我对此做了一些进一步的调查,发现即使第一个“self.assertContains(resp,self.order)”语句也失败了。但是,当我运行 test_views 时,只有这个“self.assertContains(resp,self.order)”测试通过,但是当我一起运行所有测试时它失败了。我注意到在 test_forms 目录中注释掉 5 个不同的视图后,当我运行测试时它们都通过了。问题是 5 个表单测试没有任何问题,它们没有模拟语句,并且拆解似乎正在工作。

然后我放了一条打印语句来查看实际显示的查询集:

打印 Order.objects.all() 显示“,]>”,当我 print(self.order.completed) 也出现时。然而,测试失败的结果显示:“AssertionError: False is not true : Couldn't find '25' in response” 即使 25 显然已经完成。视图代码看起来也很完美,视图是一个非常简单的视图。这可能是什么原因造成的?

我还注意到,如果我运行 py.test,我只需要注释掉 3 个表单测试,它就会全部通过,但是使用 manage.py test 我必须注释掉 5 个表单测试才能通过。

我只是使用 print(resp.context_data) 来查看响应中的实际内容......

{'paginator':无,'page_obj':无,'is_paginated':假,'object_list':]>,'order_list':]>,'view':}

从这里我们可以看到命令“25”实际上是在响应中,我也打印了用户名并且它匹配。

标签: djangotestingdjango-queryset

解决方案


推荐阅读