我是嘲笑的新手。我查看了mock模块,了解了如何使用补丁装饰器模拟特定方法或模块。
为了模拟模块中的单个方法,一种方法是:
@mock.patch('module1.method1')
def test_val(self, mock_method1):
mock_method1.return_value = "whatever_i_want"
为了模拟同一模块中的多个方法,我可以这样做:
@mock.patch('module1.method2')
@mock.patch('module1.method1')
def test_val(self, mock_method1, mock_method2):
mock_method1.return_value = "whatever_i_want"
mock_method1.return_value = "whatever"
我想要的是模拟模块中的一些方法并保持其他方式不变。如果我模拟整个模块,那么该模块中的每个方法或属性都被模拟。
所以,不是像我上面所示那样单独模仿多个方法,有没有办法可以模拟整个模块(只保留某些方法不被嘲笑)?
答案 0 :(得分:1)
您可以对测试中的类进行子类化并模拟构造函数中的所有方法。然后在测试中你只使用模拟类而不是真实类。
class MockSubClass(RealClass):
def __init__(self, *args, **kwargs):
self.method_to_mock1 = mock.create_autospec(RealClass, 'method_to_mock1', ...)
...
class TestRealClass(TestCase):
def setUp(self, *args, **kwargs):
self.object_to_test = MockSubClass(...)