【发布时间】:2018-12-15 21:25:33
【问题描述】:
我有一个 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() for 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] 视为一个查询集。但似乎response.context['page_results'] 本身并不是一个查询集。我不应该在这里使用nt.assert_queryset_equal() 吗?只需使用nt.assert_equal()?
response.context['page_results'] 到底是什么?它本身是一个 QuerySet 吗?因为好像不是这样。它以['test1'] 出现。如果我将[qs] 更改为qs,那么我得到'[test1]' 作为值。我似乎无法让它们正确对齐。
我的目标是使用response.contex['study_results'] 和CaseStudy.objects.filter(title='test1') 使nt.assert_queryset_equal() 最终成为真
有人可以建议一种方法来实现这一点吗?
谢谢
【问题讨论】:
-
查看代码不完整。它缺少上下文创建,并且不清楚
page_results是什么。
标签: python django docker testing