【发布时间】:2021-06-01 13:56:01
【问题描述】:
我知道标题很混乱,但为了清楚起见,我创建了一个我必须转置的示例:
假设我在class_file.py 中有这段代码
class CarDealership:
def allow_car_out_of_the_dealership(self, car):
logger.info(f"Driving out of the dealership")
drivers_license = car.driver.wallet.get_drivers_license()
if drivers_license:
try:
allow_car_removal(car, drivers_license)
except:
deny_car_removal(car, drivers_license)
我正在尝试测试调用方法deny_car_removal 的情况。 get_valid_license() 是特定于 driver.wallet 的方法,不会以任何方式、形状或形式在 class_file.py 中导入或引用。
问题是,如果get_valid_license 在实际情况下没有返回任何有效的东西,那么代码就会走完全不同的路。我正在尝试修补drivers_license,以便最终将它带到我需要的地方。
我猜test_class_file.py 应该是这样的:
class CarDealershipTests(BaseTestCase):
@patch('class_file.CarDealership.deny_car_removal')
def test_deny_car_removal(self):
# something here
self.assertTrue(mock_deny_car_removal.called)
我通过查看其他 StackOverflow 答案尝试了一些事情,但没有奏效:
- 在测试设置中,在模拟的
car内模拟完整的driver实例,如下所示:
def setUp(self) -> None:
self._create_car
def _create_car(self):
car = Car()
car.driver = MagicMock()
- 尝试使用
@patch.object(class_file.CarDealership.allow_car_out_of_the_dealership, "car.driver.wallet.get_valid_license") - 尝试使用
@patch.object(class_file.CarDealership.allow_car_out_of_the_dealership, "drivers_license") - 尝试使用
@patch("class_file.CarDealership.allow_car_out_of_the_dealership.car.driver.wallet.get_valid_license") - 尝试使用
@patch("class_file.CarDealership.allow_car_out_of_the_dealership.drivers_license")
【问题讨论】:
-
这似乎是在使用标准的 Python 单元测试框架,关于您的实际逻辑,您应该明确了解您正在捕获的异常跨度>
标签: python unit-testing mocking pytest monkeypatching