测试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”的顺序,我也打印了用户名并且它匹配。