django测试给出异常结果

时间:2020-04-09 06:22:25

标签: django testing django-queryset

测试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()显示“,]>”,当我打印(self.order.completed)时也是如此。但是,测试失败的结果显示:“ AssertionError:False不正确:找不到响应'25'” 即使25显然已经存在并完成。视图代码看起来也很完美,并且视图是一个非常简单的视图。可能是什么原因造成的?

我还注意到如果我运行py.test,我只需要注释掉3个表单测试,它们都将通过,但是对于manage.py test,我必须注释掉5个表单测试,以使其通过。 / p>

我只是使用print(resp.context_data)来查看响应中实际上是什么...

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

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

0 个答案:

没有答案