Django中过滤器查询搜索的测试用例开发



我正在测试一个Django Library应用程序,它有一个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的新手,刚开始使用测试用例。

如果您的url中有参数,那么您应该在测试用例中通过url发送它。

您在setUp方法中创建了一个标题为HouseBook对象;

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
...

您可以这样测试它:

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)

您可以查看测试工具文档以了解更多详细信息。

最新更新