簡體   English   中英

如何在測試方法中模擬受保護/私有方法?

[英]How to mock a protected/private method in a tested method?

我有一個帶有 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()

有人可以給我提示或解釋以找到有關此問題的解決方案嗎?

聚會有點晚了,但這里有一個替代方法:

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()我們有效地使用了一個模擬來代替私有方法。

請注意,我們需要設置my_class._MyClass__my_method而不是my_class.__my_method ,因為 Python 對私有屬性的名稱my_class.__my_method

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()
fake_temp = 15
with mock.patch.object(StateOn, '_getTemperature', return_value=fake_temp) as mock_temp:
    result = StateOn().validateTemperature()
    self.assertIsInstance(result, StateOff)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM