我正在为方法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)
。
答案 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
构造函数。