Django测试deleteview模型,覆盖'删除'方法

时间:2017-10-10 10:01:10

标签: django django-models django-tests

我正在为包含多个deleteview的django应用程序编写测试。我使用以下代码的变体测试所有deleteview:

#Object exists to begin with
response = self.client.get(reverse('roldelete', kwargs={'pk': self.role.pk}))
self.assertEqual(response.status_code, 200)

#Object Can be deleted can be posted
response = self.client.post(reverse('roldelete', kwargs={'pk': self.role.pk}))
self.assertEqual(response.status_code, 302)

#Object is actually deleted
response = self.client.get(reverse('roldelete', kwargs={'pk': self.role.pk}))
self.assertEqual(response.status_code, 404)

#Query returns an empty result
self.assertFalse(Role.objects.filter(pk=self.role.pk).exists())

所有这一切都运行良好,但是,在我的模型中,我已经覆盖了默认的'删除'方法。基本上每当我删除一个' TenantPurchase'对象我想检查链接' PurchaseRequest'是否存在对象并删除它。我在TenantPurchase模型中编写了以下代码:

def delete(self, *args, **kwargs):
    try:

        purchase_user = self.user
        purchase_arrangement_period = self.item

        #Import here to avoid circular import
        from arrangement.models import ArrangementBuyRequest

        linked_buy_request = ArrangementBuyRequest.objects.filter(
            user=purchase_user,
            arrangement_period=purchase_arrangement_period) \
            .order_by('request_date').last()

        linked_buy_request.delete()
    except (ArrangementBuyRequest.DoesNotExist, AttributeError) as e:
        pass

    super(TenantPurchase, self).delete(*args, **kwargs)

当我在我们的开发服务器上手动测试时,我的行为应该如此。已删除已链接的购买请求,并且不会引发任何错误。

但是,此模型的所有Unittests都失败了。 它通过前三个测试(断言200,断言302,断言404)

但直接查询显示该对象仍然存在

self.assertFalse(
        TenantPurchase.objects.filter(tenant=self.tenant, user=self.user, item_id=self.period.pk).exists())


Traceback (most recent call last):
(...), line 105, in test_linked_request_deleted

self.assertFalse(ArrangementBuyRequest.objects.filter(user=self.user,         arrangement_period=self.period).exists())
AssertionError: True is not false

同样关联的购买请求:

# Check if the related buyrequest has been deleted as well
    self.assertFalse(ArrangementBuyRequest.objects.filter(user=self.user, arrangement_period=self.period).exists())

Traceback (most recent call last):
(...), line 80, in test_tenant_purchase_deleted
TenantPurchase.objects.filter(tenant=self.tenant, user=self.user, item_id=self.period.pk).exists())
AssertionError: True is not false

由于这种情况与所有其他(通过)测试之间的唯一区别是被覆盖的'删除'模型中的方法,是因为问题来自那个部分(可能是在测试中没有正确加载) 但是我找不到导致测试失败的错误。它没有帮助我们的开发服务器上的一切正常工作,使得难以查明错误。

有没有人知道我错过了什么?

1 个答案:

答案 0 :(得分:1)

在发现我自己的一些问题时偶然发现了这一点,并且只是想指出你this answer。当通过QuerySet操作删除对象(也就是任何批量操作,从管理员中删除所有操作等)时,Django不会调用模型删除功能并直接与表进行交互。链接的答案提供了一个如何解决这个问题的例子,看起来它可能就是你正在寻找的东西。