Python使用模拟类测试方法

Python使用模拟类测试方法,python,mocking,Python,Mocking,我正在为一个方法编写一个单元测试MyClass.validate: def validate(self, x): if x > self.y: return True 我想模拟MyClasss.t。我可以将yattr设置为一个值(例如42),但仍然可以调用MyClass.validate。怎样我已经浏览了许多magic mock和patch博客文章,以及其他问题,但似乎没有一个能解决这个用例。例如,我能做什么 @mock.patch('path.to.my_cla

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

def validate(self, x):
    if x > self.y:
        return True
我想模拟
MyClass
s.t。我可以将
y
attr设置为一个值(例如42),但仍然可以调用
MyClass.validate
。怎样我已经浏览了许多magic mock和patch博客文章,以及其他问题,但似乎没有一个能解决这个用例。例如,我能做什么

@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)

您可以使用


这将只修补该属性,类上的所有其他函数将是原始的。

不使用模拟模块:

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
构造函数从未被调用。

不清楚为什么需要在这里使用mock。只需在测试之前设置
MyClass.y
的值,并在测试之后(如有必要)恢复原始值。我需要模拟该类,因为它不可能(更不用说糟糕的单元测试形式)在测试工具中创建该类的完整实例。为什么不能在单元测试中实例化
MyClass
?在unittests中实例化类是一种不错的形式。另外,实例化类与实例化
Mock
对象有什么不同?如果您担心实例化类会完成多少工作,这可能表明您在初始值设定项中做了太多的工作,这些工作可能会推迟到以后。在许多情况下,您不希望为了单元测试方法而初始化类。也许
MyClass
实现了一些功能并将消息发布到一些外部客户端(例如ROS主题),而
MyClass
的初始化建立了网络连接。我们只想对实现的功能进行单元测试,而不必建立消息传递协议。在某些情况下,我们可以重构构造函数以避免出现这种情况,但有时这并不简单或不可能(例如,如果
MyClass
是一个外部模块)。谢谢,我尝试过这种方法,但出于某种原因,get`AttributeError:没有属性“y”`
y
必须是一个实例属性。我已经更新了该场景的答案。您现在使用mock.patch.object(MyClass'y',new=42)从
编辑:
,我不能这样做,因为我无法创建该类的实例。如果不创建该类的实例,您希望如何在该类上测试函数?您需要提供更多信息,说明为什么无法创建该类的实例。你可以使用模拟来处理你所担心的任何外部影响。。。。所以这个问题
class MockMyClass(MyClass):
    def __init__(self, y):
        self.y = y

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