gpt4 book ai didi

python - 使用 Python 模拟模块,我如何修补一个类,以便它只 stub 我想 stub 的方法而单独保留其他属性和方法?

转载 作者:太空宇宙 更新时间:2023-11-03 13:39:14 24 4
gpt4 key购买 nike

我想做的是在一个类中 stub 几个方法,这些方法在我正在测试的某些代码中间接实例化。我希望该修补类的所有其他属性和方法都能正常运行。

这是一个显示我想要的东西的简单案例 (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 对象?我怎样才能修补这个类,以便它只对我想要的方法进行 stub ,而不管其他所有方法?

最佳答案

你应该使用 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 模拟模块,我如何修补一个类,以便它只 stub 我想 stub 的方法而单独保留其他属性和方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34516379/

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