在编写Django测试用例时访问带注释的查询集

时间:2016-03-21 14:50:31

标签: django django-testing

我正在尝试编写一个使用通过注释添加的属性的测试用例,但我的测试用例无法使用它,任何想法我该如何解决?感谢

我模特中的属性:

@property
def amount_net(self):
    net_sum = self.amount_net_sum
    return Decimal(round(net_sum, 2)) if net_sum else Decimal("0.00")

self.amount_net_sum来自自定义经理:

class InvoiceManager(models.Manager):

    def get_queryset(self):
        qs = super().get_queryset()
        qs = qs.annotate(amount_net_sum=Sum('line_items__amount_net'))
        return qs

在测试用例中:

self.invoice_test1 = Invoice.objects.create(
            state=InvoiceStatus.NEW, language='en',
            type=InvoiceType.INVOICE,
            created=date(2015, 1, 30),
            recipient=profile, 
        )

self.assertEqual(self.invoice_test1.amount_net, self.line_item_sum_net,
                         'Checks if the invoice calculated and expected values are same')

错误:

AttributeError: 'Invoice' object has no attribute 'amount_net_sum'

1 个答案:

答案 0 :(得分:1)

使用您的代码创建了对象self.invoice_test1 ,它没有从数据库中获取。因此,未使用您的自定义管理器,并且未对该对象进行注释。

如果从数据库中重新获取对象,则应对其进行注释。然后,您可以在assertEqual检查中使用重新获取的对象。

self.invoice_test1 = Invoice.objects.get(pk=self.invoice_test1.pk)

当对象没有amount_net属性时,你应该改变amount_net_sum属性来处理这种情况,而不是让它引发AttributeError