【问题标题】:python - Accessing objects mocked with patchpython - 访问用补丁模拟的对象
【发布时间】:2012-03-18 11:35:37
【问题描述】:

我一直在使用mock 库进行一些测试。到目前为止一切都很好,但有些事情我还没有完全理解。

mock 提供了一种使用patch 修补整个方法的好方法,我可以通过如下方法访问修补的对象:

@patch('package.module')
def test_foo(self, patched_obj):
    # ... call patched_obj here
    self.assertTrue(patched_obj.called)

我的问题是,如果我在整个类上使用 patch 装饰器,我如何访问已修补的对象?

例如:

@patch('package.module')
class TestPackage(unittest.TestCase):

    def test_foo(self):
        # how to access the patched object?

【问题讨论】:

    标签: python unit-testing testing mocking


    【解决方案1】:

    在这种情况下,test_foo 将有一个额外的参数,与装饰方法时的方式相同。如果您的方法也被修补,那么这些参数也将被添加:

    @patch.object(os, 'listdir')
    class TestPackage(unittest.TestCase):
        @patch.object(sys, 'exit')
        def test_foo(self, sys_exit, os_listdir):
            os_listdir.return_value = ['file1', 'file2']
            # ... Test logic
            sys_exit.assert_called_with(1)
    

    参数顺序由装饰器调用的顺序决定。首先调用方法装饰器,因此它附加第一个参数。类装饰器是外部的,所以它会添加第二个参数。当您将多个补丁装饰器附加到同一个测试方法或类(即外部装饰器放在最后)时,这同样适用。

    【讨论】:

    • 啊,是的,谢谢!我应该先检查一下。在这种情况下如何确定顺序?另外,是否可以在第一个补丁模块上应用另一个补丁(例如,如果package.module 有几个我想模拟的具有不同返回值的对象)?
    • 我已经更新了答案。您可以根据需要使用尽可能多的补丁装饰器。
    • 有趣的是,setUp 方法不会有额外的参数,因为类上有补丁装饰器。
    猜你喜欢
    • 2015-12-17
    • 2023-03-24
    • 2020-11-26
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    相关资源
    最近更新 更多