Разработка тестовых примеров для поиска по фильтру в Django - PullRequest
0 голосов
/ 21 декабря 2018

Я тестирую приложение библиотеки Django, в котором есть модель Book и строка поиска для фильтрации этих книг , которая проверяет title__icontains = 'q'.

Шаблон URL :

path('search_book/', views.BookSearchListView.as_view(), name='search_book'),

Маршрутизация URL:

 http://127.0.0.1:8000/catalog/search_book/?q=house

Реализация следующего Представления на основе классов :

class BookSearchListView(BookListView):
  paginate_by = 3

  def get_queryset(self):
    result = super(BookSearchListView, self).get_queryset()

    query = self.request.GET.get('q')
    if query:
        query_list = query.split()
        result = result.filter(
            reduce(operator.and_,
                   (Q(title__icontains=q) for q in query_list))
        )

    return result

В моем tests.py я должен разработать контрольные примеры для вышеприведенного представления, но не понимаю, как это сделать.Я попытался сделать следующее:

class BookSearchListViewTest(TestCase):
"""
        Test case for the Book Search List View
"""
   def setUp(self):
    test_user1 = User.objects.create_user(username='testuser1', password='1X<ISRUkw+tuK')
    test_user1.save()

    test_author = Author.objects.create(first_name='John', last_name='Smith')
    Book.objects.create(title='House', author=test_author, summary='Published in 1990',
                        isbn='123456789123')
    Book.objects.create(title='Money', author=test_author, summary='Published in 1991',
                        isbn='9876543210123')
    Book.objects.create(title='Mouse', author=test_author, summary='Published in 1992',
                        isbn='1293874657832')

   def test_redirect_if_not_logged_in(self):
    response = self.client.get(reverse('books'))
    self.assertRedirects(response, '/catalog/customer_login/?next=/catalog/books/')

   def test_query_search_filter(self):
    self.assertQuerysetEqual(Book.objects.filter(title__icontains='House'), ["<Book: House>"])

Пока тест test_query_search_filter выполняется успешно, в моем отчете о покрытии класс BookSearchListView не проходит тестирование.

Я новичок в Django и имеютолько что начал с тестовых случаев.

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Если у вас есть параметр в вашем URL, вы должны отправить его через url в вашем тестовом примере.

Вы создали объект Book с заголовком House в вашем методе setUp, поэтому

  def test_query_filter(self):
     # If you have login required to access 'books' then
     # you have to login with 'client.login' first.
     url = '{url}?{filter}={value}'.format(
        url=reverse('books'),
        filter='q', value='Hou')
     # With string format finally we expect a url like;
     # '/books/q=Hou'
     self.client.login(username='testuser1', password='1X<ISRUkw+tu')
     response = self.client.get(url)
     ...
     # test cases
     ...
0 голосов
/ 21 декабря 2018

Вы можете проверить это следующим образом:

def test_redirect_if_not_logged_in(self):
    self.client.login(username='testuser1', password='1X<ISRUkw+tu')
    response = self.client.get(reverse('books'))
    self.assertQuerysetEqual(response.context['object_list'], Book.objects.all(), transform= lambda x:x)

Вы можете проверить документацию инструментов тестирования для получения более подробной информации.

...