django - 如何在 Django 中测试 CBV 返回的查询集的数量
问题描述
对于房地产应用程序,我有一个搜索表单和一个基于类的 ListView,它仅显示与表单中的搜索查询匹配的对象(属性):
# views.py
from django.views.generic import ListView
from django.db.models import Q
from .models import Property
from .forms import PropertyForm
class ListPageView(ListView):
template_name = 'property_list.html'
model = Property
def get_queryset(self):
plz = self.request.GET.get('plz')
rooms = self.request.GET.get('rooms')
if plz and not rooms:
object_list = Property.objects.filter(zip_code__exact=plz)
elif rooms and not plz:
object_list = Property.objects.filter(rooms__exact=rooms)
elif plz and rooms:
object_list = Property.objects.filter(
Q(zip_code__icontains=plz) & Q(rooms__exact=rooms)
)
else:
object_list = self.model.objects.none()
return object_list
测试
我写了一个测试来检查我的观点的逻辑。我能够编写一个测试来检查查询集是否不返回任何内容:
from django.test import TestCase
from django.db.models import Q
from na_mi.models import Property
class ListPageViewTest(TestCase):
@classmethod
def setUpTestData(cls):
Property.objects.bulk_create(
[Property(zip_code=4054,rooms=1),
Property(zip_code=4132,rooms=4),
Property(zip_code=4132,rooms=4),
Property(zip_code=4132,rooms=3),
Property(zip_code=4056,rooms=1)]
)
# tests if the queryset returns nothing
def test_view_no_match(self):
response = self.client.get('/list/')
self.assertContains(response, 'Sorry, no search result')
问题:如果它返回正确数量的查询集,我如何测试我的视图?
我想要一个测试来确保返回正确数量的查询集。类似的东西(伪代码)。
def test_view_show_zip_code_only(self):
response = self.client.get('/list/?plz=4054&rooms=&title=/')
self.assertContains(response.NUMBER_OF_QUERYSETS_RETURNED, '1')
这里它应该只返回一个查询集,因为数据库中只存在一条与查询(plz=4054
)匹配的数据库记录,没有其他请求。
我找到了这个TransactionTestCase.assertNumQueries(num, func, *args, **kwargs)
函数,但我不想测试我的查询集我想测试我的视图。
怎么做?
解决方案
首先,这里只有一个查询集,包含许多模型实例;我想这是您关心的实例数。
答案是来自测试客户端的响应使您可以访问用于呈现它的上下文;然后,您可以断言对象列表的长度:
object_list = response.context['object_list']
self.assertEqual(object_list.count(), 1)
推荐阅读
- javascript - 无法动态单击选择选项
- python - 如何修复“ZeroDivisionError:浮点除以零”
- iis - launchsettings.json - commandName、IIS 还是 Project for Production?
- javascript - 从父级调用子级函数说“不是函数”?
- python - 使用带有 http.client 的 api 来解析 imdb 电影数据库
- laravel - Eloquent:获取每月每一天的数据
- ffmpeg - 如何使用 MSYS2 环境为 Windows 静态编译 ffmpeg?
- c# - Selenium Firefox 不添加扩展
- c# - “新标准内核()”上的“无法加载文件或程序集 'Ninject.Web.Common'”错误
- android - 过滤recyclerview后获取位置