如何在测试方法中模拟 protected/private 方法?
How to mock a protected/private method in a tested method?
我有一个 Python 类,有 2 个方法。
第一个 _getTemperature_()
是受保护的,第二个是 public 方法。我必须写一个 unitTest 但我不知道如何模拟受保护的方法?我刚刚找到了模拟直接在测试中使用的 public 方法的教程。但不是在应该被测试的方法中。
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()
有人可以给我提示或解释以找到有关此问题的解决方案吗?
fake_temp = 15
with mock.patch.object(StateOn, '_getTemperature', return_value=fake_temp) as mock_temp:
result = StateOn().validateTemperature()
self.assertIsInstance(result, StateOff)
def test_validate_temprature(self):
state = StateOn()
fake_temp = 15
with mock.patch.object(state, '_StateOn__getTemperature_', return_value=fake_temp) as temp_mock:
result = state.validateTemperature()
self.assertIsInstance(result, StateOff)
temp_mock.assert_called_once()
聚会有点晚了,但这里有另一种方法:
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...
通过将 my_class._MyClass__my_method
设置为 mock.Mock()
,我们可以有效地使用模拟来代替私有方法。
请注意,由于 Python 的 name mangling 私有属性,我们需要设置 my_class._MyClass__my_method
而不是 my_class.__my_method
。
我有一个 Python 类,有 2 个方法。
第一个 _getTemperature_()
是受保护的,第二个是 public 方法。我必须写一个 unitTest 但我不知道如何模拟受保护的方法?我刚刚找到了模拟直接在测试中使用的 public 方法的教程。但不是在应该被测试的方法中。
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()
有人可以给我提示或解释以找到有关此问题的解决方案吗?
fake_temp = 15
with mock.patch.object(StateOn, '_getTemperature', return_value=fake_temp) as mock_temp:
result = StateOn().validateTemperature()
self.assertIsInstance(result, StateOff)
def test_validate_temprature(self):
state = StateOn()
fake_temp = 15
with mock.patch.object(state, '_StateOn__getTemperature_', return_value=fake_temp) as temp_mock:
result = state.validateTemperature()
self.assertIsInstance(result, StateOff)
temp_mock.assert_called_once()
聚会有点晚了,但这里有另一种方法:
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...
通过将 my_class._MyClass__my_method
设置为 mock.Mock()
,我们可以有效地使用模拟来代替私有方法。
请注意,由于 Python 的 name mangling 私有属性,我们需要设置 my_class._MyClass__my_method
而不是 my_class.__my_method
。