Python使用模拟类测试方法

时间:2017-12-19 18:58:03

标签: python mocking

我正在为方法MyClass.validate编写单元测试:

def validate(self, x):
    if x > self.y:
        return True

我想嘲笑MyClass s.t.我可以将y attr设置为一个值(例如42),但仍然可以调用MyClass.validate。怎么样?我经历过许多魔术模拟和补丁博客帖子和SO问题,但似乎没有人解决这个用例。例如,我可以做

@mock.patch('path.to.my_class.MyClass')
def create_mock_class(MockMyClass):
    MockMyClass.y = 42
    return MockMyClass

mock_class = create_mock_class()

但是mock_class.validate是一个无法使用的MagicMock。我希望能够打电话给我的单元测试中assert mock_class.validate(55)

2 个答案:

答案 0 :(得分:0)

您可以使用mock.patch.object

myclass = MyClass()

with mock.patch.object(myclass, 'y', new=42):
    assert myclass.validate(55)

这只会修补一个属性,而类中的所有其他函数都将是原始属性。

答案 1 :(得分:0)

不使用模拟模块:

class MockMyClass(MyClass):
    def __init__(self, y):
        self.y = y

mock_class = MockMyClass(42)
assert mock_class.validate(55)

调用MyClass.validate,其内部使用实例的y attr。

这实现了目标b / c永远不会调用MyClass构造函数。