Django测试中的匹配查询集

2021-04-11 23:25:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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”中返回的queryset与我知道的应该匹配CaseStudy.objects.get(title='test1')应该返回正确的CaseStudy对象,因为它是测试数据库中唯一的一个。然而,这似乎行不通。我还试着将“研究结果”与<CaseStudy: test1>进行比较,甚至尝试用QuerySet()来包装它。它仍然不起作用,似乎将我的QuerySet()看作是将test1字符串划分为一个单个字符的列表。在

我尝试过同时使用nt.assert_equal()和{}这两种方法都不起作用。在

什么是使这些断言通过的正确/有效的方法?我知道study_results上下文在本例中返回CaseStudy:test1。我只是在断言中似乎找不到匹配。因为我是从objects.filter得到的,所以它已经是一个查询集了,但是即使使用.get()我也不能让它工作。在

我的问题似乎是在比较的右边,即使我只是把'test1或{}或{}放进去,也没用。在

任何帮助都将不胜感激。在

编辑:

使用此代码时遇到此错误:

^{pr2}$

错误:

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]

编辑2:

相关搜索结果视图代码:

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'])

编辑3:

我把代码改成这样:

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]看作一个查询集。但是response.context['page_results']本身并不是一个查询集。我不应该在这里使用nt.assert_queryset_equal()?只使用nt.assert_equal()?在

究竟什么是response.context['page_results']?它是一个独立的查询集吗?因为似乎不是这样。它显示为['test1']。如果我将[qs]改为qs,那么我得到'[test1]'作为值。我好像不能让他们正确对齐。在

我的目标是使用response.contex['study_results']和{}使nt.assert_queryset_equal()最终为true

有人能提出一个实现这一目标的方法吗?在

谢谢