python - 访问使用补丁模拟的对象

时间:2012-03-18 11:35:37

标签: python unit-testing testing mocking

我一直在使用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?

1 个答案:

答案 0 :(得分:8)

在这种情况下,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)

参数顺序由装饰器调用的顺序决定。首先调用方法装饰器,因此它附加第一个参数。类装饰器是外部的,因此它将添加第二个参数。将几个补丁修饰符附加到同一个测试方法或类(即外部装饰器最后一个)时也是如此。