首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python中创建MagicMock子类化

在python中创建MagicMock子类化
EN

Stack Overflow用户
提问于 2015-04-07 19:53:20
回答 1查看 3.6K关注 0票数 2

我有一个需要修补的类,它的工作原理类似于

代码语言:javascript
复制
class Foo(object):
    def __init__(self, query):
        self._query = query

    def do_stuff(self):
        # do stuff with self._query

我如何为Foo设置一个模拟类,以便

代码语言:javascript
复制
foo = MockFoo(query)
foo.do_stuff()

返回模拟结果,但仍考虑为query传入的数据。我想过像这样将MagicMock子类化

代码语言:javascript
复制
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。我需要能够写一个类似这样的测试。

代码语言:javascript
复制
with patch('x.Foo') as mock_foo:
    # run test code
    self.assertTrue(mock_foo.called)
    self.assertEqual(mock_foo.wait.return_value, 20)

我知道我可以只将普通的MagicMockautospec=True或其他东西一起使用,并覆盖每个方法的返回值,但如果有一个模拟类来一次性替换生产类,那就太好了。关键之处在于,必须在模拟方法中访问成员变量self._query,同时在构造函数中对其进行初始化(就像生产类一样)。

EN

回答 1

Stack Overflow用户

发布于 2015-04-07 20:38:11

关于你的基本问题答案是在patch中使用new_callable参数:

代码语言:javascript
复制
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不是包装器。

当你模拟一些东西时,你并不是真的想知道你的模拟是如何工作的,而只是想知道你的代码是如何使用它的,以及你的代码是如何对模拟的对象做出反应的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29490949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档