包装它时的python mock属性setter
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了包装它时的python mock属性setter,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1222字,纯文字阅读大概需要2分钟。
内容图文
![包装它时的python mock属性setter](/upload/InfoBanner/zyjiaocheng/809/2ef6e6d4072d4490aa546bc435860011.jpg)
如何在包装它时模拟python属性setter(即调用原始setter)?最直接的方法是访问__set__,但它只是属性的只读,所以不起作用.
from unittest import TestCase
from unittest.mock import patch, PropertyMock
class SomeClass:
def __init__(self, value):
self._value = value
@property
def value(self):
return self._value + 1
@value.setter
def value(self, value):
self._value = value + 1
class TestSomeClass(TestCase):
def test_value_setter(self):
instance = SomeClass(0)
with patch.object(SomeClass.value, '__set__', wraps=SomeClass.value.__set__) as value_setter:
instance.value = 1
value_setter.assert_called_with(instance, 1)
self.assertEquals(instance.value, 3)
在文档中还有new_callable = PropertyMock,我试图将它与wrap结合起来,但还没有让它工作.
解决方法:
您需要替换整个属性对象;你不能简单地更换二传手.这意味着你需要提供一个新的属性对象,其中setter是原始setter的模拟包装器(由property.fset属性访问):
setter_mock = Mock(wraps=SomeClass.value.fset)
mock_property = SomeClass.value.setter(setter_mock)
with patch.object(SomeClass, 'value', mock_property):
instance.value = 1
setter_mock.assert_called_with(instance, 1)
我在这里重用@ property.setter装饰器;它返回一个具有原始属性的所有属性的新属性对象,除非将setter替换为传入的内容;见How does the @property decorator work?
内容总结
以上是互联网集市为您收集整理的包装它时的python mock属性setter全部内容,希望文章能够帮你解决包装它时的python mock属性setter所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。