使用 Python mock 监视对现有对象的调用

新手上路,请多包涵

我正在使用 Python 模拟模块进行测试。我想用模拟替换活动对象,并自动将对模拟对象的所有调用转发给原始对象。我认为这在标准测试术语中被称为“间谍”。目前我正在做一个测试:

 # Insert a mock replacement
orig_active_attr = server.active_attr
server.active_attr = mock.Mock()

# Set up side effects to 'proxy' to the original object
server.active_attr.meth1.side_effect = orig_active_attr.meth1
server.active_attr.meth2.side_effect = orig_active_attr.meth2

# Call the method being tested
server.method_being_tested()

# Assert stuff on the mock.
server.active_attr.meth2.assert_called_once()

如果 mock 上的所有方法调用都可以在没有样板的情况下自动转发到活动对象,那就太好了。

原文由 NeilenMarais 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 378
2 个回答

我似乎偶然发现了解决方案:

 import mock

class A(object):
    def meth(self, a):
        return a
a = A()
ma = mock.Mock(wraps=a)

似乎适用于函数、方法和属性,但不适用于类或实例属性。

请参阅 文档

原文由 NeilenMarais 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以使用 patch.object(wraps=obj_instance) 按照 使用 Python 的模拟模块监视实例方法 中的建议。

例如:

 from mock import patch

class Foo(object):
    def bar(self, x, y):
        return x + y + 1

def test_bar():
    foo = Foo()
    with patch.object(foo, 'bar', wraps=foo.bar) as wrapped_foo:
        foo.bar(1, 2)
        wrapped_foo.assert_called_with(1, 2)

原文由 Wilfred Hughes 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题