我一直在使用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?
答案 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)
参数顺序由装饰器调用的顺序决定。首先调用方法装饰器,因此它附加第一个参数。类装饰器是外部的,因此它将添加第二个参数。将几个补丁修饰符附加到同一个测试方法或类(即外部装饰器最后一个)时也是如此。