Как проверить в Django число наборов запросов, возвращаемых CBV - PullRequest
0 голосов
/ 19 сентября 2019

Для приложения по недвижимости у меня есть форма поиска и 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), но я не хочу проверять свой набор запросов. Я хочу проверить свое представление.

Как это сделать?

1 Ответ

1 голос
/ 19 сентября 2019

Для начала, здесь есть только один набор запросов, содержащий несколько экземпляров модели;Я предполагаю, что это количество экземпляров, которые вас волнуют.

Ответ таков: ответ от тестового клиента дает вам доступ к контексту, который использовался для его визуализации;Затем вы можете установить длину списка объектов:

object_list = response.context['object_list']
self.assertEqual(object_list.count(), 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...