我如何测试Django QuerySet是否相等?

问题描述 投票:25回答:6

我正在尝试测试我的Django视图。该视图将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())

EDIT我正在使用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的第4天,因此,如果可能的话,我想了解最佳做法。谢谢。

python django django-queryset django-testing
6个回答
25
投票

默认情况下,assertQuerysetEqual在第一个参数上使用repr()。这就是为什么查询集比较中的字符串有问题。


21
投票
repr()

8
投票

4
投票

3
投票

0
投票

我发现使用qazxswpoi也解决了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.