我有一个需要修补的类,它的工作原理类似于
class Foo(object):
def __init__(self, query):
self._query = query
def do_stuff(self):
# do stuff with self._query我如何为Foo设置一个模拟类,以便
foo = MockFoo(query)
foo.do_stuff()返回模拟结果,但仍考虑为query传入的数据。我想过像这样将MagicMock子类化
class MockFoo(MagicMock):
def __init__(self, query, *args, **kwargs):
super(MagicMock, self).__init__(*args, **kwargs)
self._query
def do_stuff(self):
mock_result = self._query * 10
return MagicMock(return_value=mock_result)但是我不太明白如何应用patch在实际的TestCase中使用MockFoo而不是MagicMock。我需要能够写一个类似这样的测试。
with patch('x.Foo') as mock_foo:
# run test code
self.assertTrue(mock_foo.called)
self.assertEqual(mock_foo.wait.return_value, 20)我知道我可以只将普通的MagicMock与autospec=True或其他东西一起使用,并覆盖每个方法的返回值,但如果有一个模拟类来一次性替换生产类,那就太好了。关键之处在于,必须在模拟方法中访问成员变量self._query,同时在构造函数中对其进行初始化(就像生产类一样)。
发布于 2015-04-07 20:38:11
关于你的基本问题答案是在patch中使用new_callable参数:
with patch('x.Foo', new_callable=MockFoo) as mock_foo:
# run test code
self.assertTrue(mock_foo.called)
self.assertEqual(mock_foo.wait.return_value, 20)如果您需要向MockFoo初始化调用添加一些参数,请考虑将patch中没有使用的每个参数都打包到模拟构造函数(在本例中为MockFoo)。
如果你需要一个产品类的包装器,也许你找错了地方: mock不是包装器。
当你模拟一些东西时,你并不是真的想知道你的模拟是如何工作的,而只是想知道你的代码是如何使用它的,以及你的代码是如何对模拟的对象做出反应的。
https://stackoverflow.com/questions/29490949
复制相似问题