python - 如何测试 Django QuerySets 是否相等?

标签 python django django-queryset django-testing

我正在尝试测试我的 Django View 。此 View 将 QuerySet 传递给模板:

def merchant_home(request, slug):
  merchant = Merchant.objects.get(slug=slug)
  product_list = merchant.products.all()
  return render_to_response('merchant_home.html',
                            {'merchant': merchant,
                            'product_list': product_list},
                            context_instance=RequestContext(request))

和测试:

  def test(self):
    "Merchant home view should send merchant and merchant products to the template"
    merchant = Merchant.objects.create(name='test merchant')
    product = Product.objects.create(name='test product', price=100.00)
    merchant.products.add(product)

    test_client = Client()
    response = test_client.get('/' + merchant.slug)
    # self.assertListEqual(response.context['product_list'], merchant.products.all())
    self.assertQuerysetEqual(response.context['product_list'], merchant.products.all())

编辑 我正在使用 self.assertQuerysetEqua l 代替self.assertListEqual .不幸的是,这仍然不起作用,终端显示: ['<Product: Product object>'] != [<Product: Product object>]


assertListEqual加薪:'QuerySet' object has no attribute 'difference'assertEqual也不起作用,尽管 self.assertSetEqual(response.context['product_list'][0], merchant.products.all()[0])确实通过了。

我认为这是因为 QuerySet 是不同的对象,即使它们包含相同的模型实例。

如何测试两个 QuerySet 是否包含相同的数据?我什至正确地测试了这个?这是我学习 Django 的第四天,所以如果可能的话,我想知道最佳实践。谢谢。

最佳答案

默认情况下,assertQuerysetEqual 在第一个参数上使用 repr()。这就是您在查询集比较中遇到字符串问题的原因。

要解决此问题,您可以 override the transform argument使用不使用 repr()lambda 函数:

self.assertQuerysetEqual(queryset_1, queryset_2, transform=lambda x: x)

关于python - 如何测试 Django QuerySets 是否相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17685023/

相关文章:

django - 具有多级反向查找的预取对象

python - 针对真实的 MongoDB 为 Python Eve RESTful API 编写测试

python - 遍历有效数独的子框

python - DJANGO:如何允许用户更改密码?

Django继承基类super

python - Django 相交计数注释用于排序

使用 Pandas 和 Anaconda 的 Python 值错误

python - 在 Python 中分配空值或字符串

python - Rest API 应用程序在 'Sandbox' 但不是 'Live' 工作

python - Django 查询集显示英文翻译