Соответствие QuerySets в тестировании Django - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть приложение 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')

Может кто-нибудь предложить метод достиженияэто?

Спасибо

1 Ответ

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

Я не уверен, почему вы вызываете QuerySet для этого запроса.filter() уже возвращает набор запросов;Кажется, нет никакой причины, чтобы обернуть это в другое.Вы должны удалить это.

qs = CaseStudy.objects.filter(title='test1')
nt.assert_queryset_equal(response.context['study_results'], qs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...