gpt4 book ai didi

python - 在 Django 测试中匹配查询集

转载 作者:行者123 更新时间:2023-11-28 20:36:05 25 4
gpt4 key购买 nike

我有一个 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]

编辑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']是一个 QuerySet 本身。我不应该使用 nt.assert_queryset_equal() 吗?这里?只需使用 nt.assert_equal()

response.context['page_results'] 到底是什么? ?它本身就是一个 QuerySet 吗?因为好像不是。它出现为 ['test1'] .如果我改变 [qs]qs然后我得到'[test1]'作为值(value)。我似乎无法让它们正确对齐。

我的目标是拥有 nt.assert_queryset_equal()使用 response.contex['study_results'] 最终为真和 CaseStudy.objects.filter(title='test1')

有人可以建议实现此目的的方法吗?

谢谢

最佳答案

我不确定您为什么要针对该查询调用 QuerySet。 filter() 已经返回一个查询集;似乎没有任何理由将它包装在另一个中。你应该删除它。

qs = CaseStudy.objects.filter(title='test1')
nt.assert_queryset_equal(response.context['study_results'], qs)

关于python - 在 Django 测试中匹配查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53797397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com