У меня есть приложение Django, и в моем тестировании я запускаю этот код:
def test_search_keywords_logic(self):
response = self.client.get(reverse('search-results'), { 'q': 'test11' })
nt.assert_equal(response.status_code, 200)
nt.assert_equal(response.context['query_string'], 'test11')
nt.assert_equal(response.context['total_results'], 1)
nt.assert_equal(response.context['found_results'], True)
qs = QuerySet(CaseStudy.objects.filter(title='test1'))
nt.assert_queryset_equal(response.context['study_results'], qs)
В последней строке: nt.assert_queryset_equal(response.context['study_results'], qs)
выдает ошибку: AttributeError: 'QuerySet' object has no attribute '_meta'
Яне уверен, что это значит.Все, что я хочу сделать, это утверждать, что набор запросов, возвращенный в переменной контекста 'study_results', соответствует тому, что, как я знаю, должно быть CaseStudy.objects.get(title='test1')
, должно возвращать правильный объект CaseStudy, поскольку он единственный в тестовой базе данных.Тем не менее, это не похоже на работу.Я также попытался просто сравнить контекст ответа 'study_results' с <CaseStudy: test1>
и даже попытался обернуть его в QuerySet()
.Это все еще не работало, казалось, видел мою QuerySet()
для test1 как строку test1, разделенную на список одиночных символов.
Я пытался использовать как nt.assert_equal()
, так и nt.assert_queryset_equal()
Ни то, ни другое.
Каков будет правильный / рабочий способ пропустить эти утверждения?Я знаю, что контекст study_results возвращает CaseStudy: test1 в этом случае.Я просто не могу заставить его совпадать с утверждением.Поскольку я получаю его от objects.filter
, это уже набор запросов, но даже с .get()
я не смог заставить его работать.
Кажется, моя проблема в правой части сравнения, даже когда я просто ввел 'test1
или <CaseStudy: test1>
или QuerySet('test1')
, она не работает.
Любая помощьбудет признателен.
РЕДАКТИРОВАТЬ:
Обнаружил эту ошибку, используя этот код:
qs = CaseStudy.objects.filter(title='test1')
nt.assert_queryset_equal(response.context['study_results'], qs)
Ошибка:
FAIL: test_search_keywords_logic (sasite.tests.tests.TestSearch)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/app/sasite/tests/tests.py", line 62, in test_search_keywords_logic
nt.assert_queryset_equal(response.context['study_results'], qs)
File "/usr/local/lib/python3.6/site-packages/django/test/testcases.py", line 972, in assertQuerysetEqual
return self.assertEqual(list(items), values, msg=msg)
AssertionError: Lists differ: ['test1'] != [test1]
First differing element 0:
'test1'
test1
- ['test1']
? - -
+ [test1]
EDIT2:
релевантный код результатов поиска:
keywords_dicts_study = CaseStudy.objects.all().values('pk', 'keywords', 'category')
match_set_study = set()
target = []
for kd in keywords_dicts_study:
keywords = kd['keywords'].split(',')
for word in keywords:
target.append(word)
target.append(kd['category'])
for query in normalize_query(query_string):
for x in target:
if query.lower().strip(',').strip() == x.lower().strip():
match_set_study.add(kd['pk'])
EDIT3:
Я изменил код на это:
qs = CaseStudy.objects.filter(title='test1')
nt.assert_equal(response.context['study_results'], [qs])
и теперь получаю эту ошибку:
Traceback (most recent call last):
File "/app/sasite/tests/tests.py", line 62, in test_search_keywords_logic
nt.assert_queryset_equal(response.context['study_results'], [qs])
File "/usr/local/lib/python3.6/site-packages/django/test/testcases.py", line 972, in assertQuerysetEqual
return self.assertEqual(list(items), values, msg=msg)
AssertionError: Lists differ: ['test1'] != [<QuerySet [test1]>]
First differing element 0:
'test1'
<QuerySet [test1]>
- ['test1']
+ [<QuerySet [test1]>]
Так что теперь он видит мой [qs]
как QuerySet.Но не похоже, что response.context['page_results']
сам QuerySet.Разве я не должен использовать nt.assert_queryset_equal()
здесь?И просто используйте nt.assert_equal()
?
Что такое response.context['page_results']
?Это QuerySet сам по себе?Потому что так не кажется.Это выглядит как ['test1']
.Если я изменю [qs]
на qs
, тогда я получу '[test1]'
в качестве значения.Кажется, я не могу заставить их выровняться правильно.
Моя цель состоит в том, чтобы nt.assert_queryset_equal()
получилось истинным, используя response.contex['study_results']
и CaseStudy.objects.filter(title='test1')
Может кто-нибудь предложить метод достиженияэто?
Спасибо