gpt4 book ai didi

python - unittest.mock.patch 一个类实例,并设置方法返回值

转载 作者:行者123 更新时间:2023-12-04 23:02:53 24 4
gpt4 key购买 nike

我有一个使用 Sensor 对象的 Alarm 对象。在我的测试中,我想用 stub 修补传感器。下面的代码有效,但我必须明确地将 stub 传递给 Alarm 构造函数:

#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)

我想做但似乎无法找到实现的方法是用 stub 替换 Sensor 实例,而不将 anthing 传递给 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)

Alarm 实例获取 MagicMock 的实例,但 'sample_pressure' 方法不返回 22。基本上我想知道是否有一种方法可以使用 unittest.mock 来测试 Alarm 类,而无需使用 Sensor 实例的构造函数作为论据。

最佳答案

当您调用 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)

关于python - unittest.mock.patch 一个类实例,并设置方法返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18872550/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com