如何测试Django QuerySets是否相等?

2024-04-24 09:34:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我在试着检验我对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())

编辑 我用的是self.assertQuerysetEqual而不是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])通过了。

我假设这是因为查询集是不同的对象,即使它们包含相同的模型实例。

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


Tags: testselfhomeobjectsresponsecontextmerchantall
3条回答

使用assertQuerysetEqual,这是为您比较两个查询集而构建的。要使Django的django.test.TestCase在测试中可用,您需要将其子类化。

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

要解决这个问题,可以使用不使用lambda函数^{

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

我也有同样的问题。assertQuerysetEqual的第二个参数需要是作为字符串的预期repr()的列表。以下是Django测试套件的一个示例:

self.assertQuerysetEqual(c1.tags.all(), ["<Tag: t1>", "<Tag: t2>"], ordered=False)

相关问题 更多 >