如何模拟补丁django模型字段?

时间:2014-11-19 22:03:30

标签: python django mocking

我有这两个型号:

class Transaction(models.Model):
    gateway_reference = models.CharField(max_length=255, null=True, blank=True)
    ...

    @property
    def abc(self):
        ...

class Item(models.Model):
    txn = models.ForeignKey('Transaction')

    def refund(self):
       Gateway.refund(self.txn)

在我的单元测试中:

def test_decline(self):
    item = Item.objects.get(...)
    with patch('app.models.Transaction.gateway_reference', new='invalid reference'):
        item.refund()

但它抱怨Transaction class does not have the attribute 'gateway_reference'

注意: 我正在为模型类的属性使用类似的补丁,它工作正常,例如。

with patch('app.models.Transaction.abc', new='lalala')

1 个答案:

答案 0 :(得分:0)

使用下面的行实例化模型时

  
    
      

item = Item.objects.get(...)

    
  

您已通过txn属性创建了对交易模型的引用。因此,在实例化之后修补该命名空间中的类Transaction为时已晚。

我会在item实例上使用补丁对象。见https://docs.python.org/dev/library/unittest.mock.html#unittest.mock.patch.object