如何模拟模块但不是所有方法?

时间:2017-08-25 16:57:03

标签: python unit-testing mocking python-unittest

我是嘲笑的新手。我查看了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"

我想要的是模拟模块中的一些方法并保持其他方式不变。如果我模拟整个模块,那么该模块中的每个方法或属性都被模拟。

所以,不是像我上面所示那样单独模仿多个方法,有没有办法可以模拟整个模块(只保留某些方法不被嘲笑)?

1 个答案:

答案 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(...)