django - 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”实际上是在响应中,我也打印了用户名并且它匹配。
解决方案
推荐阅读
- javascript - 创建导航器时,未定义不是对象(评估 this.props.navigation.navigate)
- regex - 带有黑名单的骆驼案例的正则表达式
- java - 在 CN (Java) 中删除 0x0A 的 LDAP 记录
- python - 如何在 Python 中格式化语句和循环?
- python - 如何使用 Python 更新计划事件中的变量?
- c++ - C++ 字符串操作
- r - R BootStrap 数据帧
- function - 函数不调用scrapy/webcrawler
- d3.js - deck.gl 中的图例
- android - android.database.sqlite.SQLiteException:靠近“?”:语法错误(代码 1):