【问题标题】:Matching QuerySets in Django Testing在 Django 测试中匹配查询集
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 是的,刚刚意识到哈哈。甚至在我阅读您的答案之前,就将我的代码切换为您刚刚建议的内容。现在测试,如果它有效,我会接受答案。谢谢
  • 阅读我的编辑,了解您建议的代码发生了什么。
  • 您可能应该显示搜索结果视图的代码。
  • 好的就行。添加了代码。只想让这个对 assert_queryset_equal 的调用成功。我可以告诉它访问正确的数据,我有正确的标题和一切。但它在匹配时显示不正确。
  • 我最终使用了您建议的代码,但仍然无法正常工作。我在第一次编辑中得到了结果
猜你喜欢
  • 1970-01-01
  • 2021-02-08
  • 2020-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
  • 2013-11-26
  • 1970-01-01
相关资源
最近更新 更多