gpt4 book ai didi

django - 你如何模拟 Django 中的 RelatedManager 方法?

转载 作者:行者123 更新时间:2023-11-28 19:47:10 25 4
gpt4 key购买 nike

我有一个 Django 模型的客户经理,它覆盖了 create 方法以保存一些相关对象:

class CustomManager(models.Manager):
def create(self, amount, user, description):
txn = self.get_query_set().create(user, description)
txn.budget_transactions.create(amount)
return txn

我的问题是:如何模拟对 txn.budget_transactions.create 的调用以引发异常?

txn 对象的 budget_transactions 属性是 django.db.models.fields.related.RelatedManager 的实例。使用 mock.patch 来模拟这个类是行不通的,因为它是动态声明的 - 它不能直接导入。

有人知道怎么做吗?

最佳答案

您不能将 RelatedManager 设置为模拟对象的原因是因为 django 已经覆盖了该对象的 set 方法。因此,虽然由于没有投诉,模拟似乎已正确设置,但它实际上是在默默地将 budget_transactions 设置回 RelatedManager。因此,如果您确实需要返回一个模拟对象,那么您需要重写返回 RelatedManager 的 get 方法并返回一个模拟对象。

最终应该看起来像这样:

@mock.patch('django.db.models.fields.related.ForeignRelatedObjectsDescriptor.__get__')
def test_campaign_cancel(self, mock_manager):
mock_manager.return_value = mock.MagicMock()
mock_manager.return_value.create = Exception('Boom!')

据说这种方法有很多缺陷,因为它将覆盖核心 django 方法,现在 ALL RelatedManagers 将返回一个模拟对象。根据我目前的经验,探索其他选择可能更容易。

关于django - 你如何模拟 Django 中的 RelatedManager 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12212786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com