2013-09-18 5 views
3

У меня есть объект 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 в качестве аргумента.

ответ

9

При вызове test_sensor_class.instance вы используете test_sensor_class в качестве владельца недвижимости, добавив Mock свойства instance, к которому вы добавляете Mock свойства sample_pressure. Ваш патч не используется вообще, ваш код на самом деле, эквивалентный:

def test_check_with_too_high_pressure(self): 
    instance = MagicMock() 
    instance.sample_pressure.return_value=22 
    alarm = Alarm(sensor=instance) 
    alarm.check() 
    self.assertTrue(alarm.is_alarm_on) 

Что вы хотите сделать это пропатчить вызов Sensor().

Используя код, вам просто нужно установить возвращаемое значение класса test_sensor_class в заданный макет Sensor.

def test_check_with_too_high_pressure(self): 
    with patch('tire_pressure_monitoring.Sensor') as test_sensor_class: 
     mockSensor = MagicMock() 
     mockSensor.sample_pressure.return_value = 22 
     test_sensor_class.return_value = mockSensor 
     alarm = Alarm() 
     alarm.check() 
     self.assertTrue(alarm.is_alarm_on) 

 Смежные вопросы

  • Нет связанных вопросов^_^