如何在测试方法中模拟受保护/私有方法?

mic*_*mut 5 python unit-testing python-unittest python-unittest.mock

我有一个带有 2 种方法的 Python Clas。

第一个_getTemperature_()是受保护的,第二个是公共方法。我必须写一个 unitTest 但我不知道如何模拟受保护的方法?我刚刚找到了模拟直接在测试中使用的公共方法的教程。但不是在一种可以测试的方法中。

class StateOn(self):

    #Temperature in °C
    _target = 15

    # currrent Temperature by Sensor in °C
    def _getTemperature_(self):
        return valueFromSensorXY()


    def validateTemperature(self):
        if self._getTemperature_() >= self._target:
            return StateOff()
Run Code Online (Sandbox Code Playgroud)

有人可以给我提示或解释以找到有关此问题的解决方案吗?

Ren*_*rro 6

聚会有点晚了,但这里有一个替代方法:

from unittest import mock

class MyClass():
    def __my_method(self):
        # Implement logic here...
        pass

def test_my_class():
    my_class = MyClass()
    my_class._MyClass__my_method = mock.Mock()
    # Run testing stuff...
Run Code Online (Sandbox Code Playgroud)

通过设置my_class._MyClass__my_methodmock.Mock()我们有效地模拟了私有方法。

请注意,由于 Python对私有属性的名称修饰,我们需要设置my_class._MyClass__my_method和 not 。my_class.__my_method

  • 上帝保佑你,先生。过去三天我一直遇到这个问题:) (2认同)

Dan*_*Dan -1

fake_temp = 15
with mock.patch.object(StateOn, '_getTemperature', return_value=fake_temp) as mock_temp:
    result = StateOn().validateTemperature()
    self.assertIsInstance(result, StateOff)
Run Code Online (Sandbox Code Playgroud)

  • 该解决方案实际上似乎不适用于私有方法。我得到 CLASS 没有属性 __FUNCTION (11认同)