使用Python模拟模块,我如何修补一个类,以便它只存储我想要存根的方法并单独留下其他属性和方法?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用Python模拟模块,我如何修补一个类,以便它只存储我想要存根的方法并单独留下其他属性和方法?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2092字,纯文字阅读大概需要3分钟。
内容图文
我想要做的是在一个类中存取一些方法,这些方法在我正在测试的某些代码中间接实例化.我希望修补类的所有其他属性和方法正常运行.
这是一个显示我想要的简单案例(Python 2.7). (注意:在我的实际用例中,MyClass是一个在我正在测试的某些代码中间接实例化的类):
from mock import patch
class MyClass(object):
def __init__(self):
self.prop = 'prop'
def foo(self):
return 'foo'
def bar(self):
return 'bar'
def unmocked(self):
return 'unmocked'
patcher = patch('__main__.MyClass')
MockedClass = patcher.start()
instance = MockedClass.return_value
instance.foo.return_value = 'mocked foo!'
instance.bar.return_value = 'mocked bar!'
my_instance = MyClass()
assert my_instance.foo() == 'mocked foo!', my_instance.foo()
assert my_instance.bar() == 'mocked bar!', my_instance.bar()
# These asserts fail
assert my_instance.unmocked() == 'unmocked', my_instance.unmocked()
assert my_instance.prop == 'prop', my_instance.prop
patcher.stop()
结果:
$python mock_test.py
Traceback (most recent call last):
File "mock_test.py", line 27, in <module>
assert my_instance.unmocked() == 'unmocked', my_instance.unmocked()
AssertionError: <MagicMock name='MyClass().unmocked()' id='140400215338448'>
为什么unmocked方法现在返回一个MagicMock对象?我如何修补这个类,以便它只存储我想要的方法并将其他所有内容留下?
解决方法:
你应该使用patch.multiple修补你的类:
import mock
patcher = mock.patch.multiple(
'__main__.MyClass',
foo=mock.Mock(return_value='mocked foo!'),
bar=mock.Mock(return_value='bar')
)
用上面的代码更新代码后,它将运行并且所有断言都通过.这是一个完整的工作示例:
from mock import patch, Mock
class MyClass(object):
def __init__(self):
self.prop = 'prop'
def foo(self):
return 'foo'
def bar(self):
return 'bar'
def unmocked(self):
return 'unmocked'
patcher = patch.multiple('__main__.MyClass',
foo=Mock(return_value='mocked foo!'),
bar=Mock(return_value='mocked bar!'))
patcher.start()
my_instance = MyClass()
assert my_instance.foo() == 'mocked foo!', my_instance.foo()
assert my_instance.bar() == 'mocked bar!', my_instance.bar()
assert my_instance.unmocked() == 'unmocked', my_instance.unmocked()
assert my_instance.prop == 'prop', my_instance.prop
patcher.stop()
内容总结
以上是互联网集市为您收集整理的使用Python模拟模块,我如何修补一个类,以便它只存储我想要存根的方法并单独留下其他属性和方法?全部内容,希望文章能够帮你解决使用Python模拟模块,我如何修补一个类,以便它只存储我想要存根的方法并单独留下其他属性和方法?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。