gpt4 book ai didi

python - 为什么我的模拟属性没有返回指定值而是返回一个 MagicMock 对象,而我的模拟方法返回预期值?

转载 作者:行者123 更新时间:2023-11-28 19:05:42 26 4
gpt4 key购买 nike

我无法让我的测试按预期运行。我试图模拟两个属性的返回值和一个测试的方法,但我没有得到所需的返回值,而是得到了一个 MagicMock 对象。

我不知道该怎么做。最让我恼火的是,模拟该方法可以按预期工作,但对于两个属性却没有。这是我遇到的问题,是因为我正在使用属性还是因为外键关系,还是我做错了一些基本错误?

我正在使用 Django 1.8、Python2.7、model-mommy、unittests、mock

以下是我的一些代码片段,希望它们足以理解情况:

App1 调用生产者

# In producers.models.Producer:

@property
def is_valid(self):
# do stuff
return True

App2 调用客户

# In customers.models.Customer:

@property
def is_valid(self):
# do stuff
return True

def is_allowed_to_purchase_from_producer(producer):
# do stuff
return True

App3 调用购买

# In purchases.models

class Purchase(BaseModel):

producer = ForeignKey('Producers.Producer', related_name="purchase")
customer = ForeignKey('Customers.Customer', related_name="purchase")


def clean(self):
if not self.producer.is_valid:
rasie ValidationError
if not self.customer.is_valid:
raise ValidationError
if not self.customer.is_allowed_to_purchase_from_producer(self.producer):
raise ValidationError

Purchase模型clean方法测试

# test_models.py, in PurchaseTestSuite

@mock.patch('producers.models.Producer.is_valid')
@mock.patch('customers.models.Customer.is_valid')
@mock.patch('customers.models.Customer.is_allowed_to_purchase_from_producer')
def test__clean(self, mock__customer_is_allowed_to_purchase, mock__customer_is_valid, mock__producer_is_valid):

mock__producer_is_valid.return_value = True
mock__customer_is_valid.return_value = False
mock__customer_is_allowed_to_purchase.return_value = False

valid_purchase.clean()
  • producer.is_valid 的实际返回值:<MagicMock
    name='is_valid' id='4465040784'>
  • 实际返回值customer.is_valid: <MagicMock name='is_valid' id='4465109520'>
  • 对于 customer.is_allowed_to_purchase_from_producer(生产者):假

断言属性是否已被调用时,我得到 False,但对于方法,我得到 True。区别在哪里?我没有看到什么?

最佳答案

感谢 Daniel Roseman 的评论和指向 PropertyMock 的链接我设法弄清楚如何运行测试。

A mock intended to be used as a property, or other descriptor, on aclass. PropertyMock provides get() and set() methods so youcan specify a return value when it is fetched.

因此对于上面的示例,简单的解决方案是对所有属性使用 PropertyMock,如下所示:

@mock.patch('producers.models.Producer.is_valid', new_callable=mock.PropertyMock)

其余与上例相同。

如果有人遇到类似问题,我希望这对您有所帮助。

关于python - 为什么我的模拟属性没有返回指定值而是返回一个 MagicMock 对象,而我的模拟方法返回预期值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47220594/

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