У меня есть объект Alarm, который использует объект Sensor. В своем тесте я хотел бы установить Sensor с помощью Stub. Приведенный ниже код работает, но я должен явно передать в заглушке конструктору Alarm:unittest.mock.patch экземпляр класса и возвращаемые значения метода метода
#tire_pressure_monitoring.py
from sensor import Sensor
class Alarm:
def __init__(self, sensor=None):
self._low_pressure_threshold = 17
self._high_pressure_threshold = 21
self._sensor = sensor or Sensor()
self._is_alarm_on = False
def check(self):
psi_pressure_value = self._sensor.sample_pressure()
if psi_pressure_value < self._low_pressure_threshold or self._high_pressure_threshold < psi_pressure_value:
self._is_alarm_on = True
@property
def is_alarm_on(self):
return self._is_alarm_on
#test_tire_pressure_monitoring.py
import unittest
from unittest.mock import patch, MagicMock, Mock
from tire_pressure_monitoring import Alarm
from sensor import Sensor
class AlarmTest(unittest.TestCase):
def test_check_with_too_high_pressure(self):
with patch('tire_pressure_monitoring.Sensor') as test_sensor_class:
test_sensor_class.instance.sample_pressure.return_value=22
alarm = Alarm(sensor=test_sensor_class.instance)
alarm.check()
self.assertTrue(alarm.is_alarm_on)
Что я хотел бы сделать, но не могу найти способ достижения, заключается в замене Экземпляр датчика с заглушкой, без передачи ничего в конструктор Alarm. Этот код выглядит для меня, как это должно работать, но это не так:
def test_check_with_too_high_pressure(self):
with patch('tire_pressure_monitoring.Sensor') as test_sensor_class:
test_sensor_class.instance.sample_pressure.return_value=22
alarm = Alarm()
alarm.check()
self.assertTrue(alarm.is_alarm_on)
Экземпляр сигнализации получает экземпляр MagicMock, но метод «sample_pressure» не возвращается 22. В основном я хочу знать, если есть является способом использования unittest.mock для проверки класса Alarm без необходимости использования конструктора, который принимает экземпляр Sensor в качестве аргумента.