gpt4 book ai didi

python - 在 Python 中模拟自定义异常

转载 作者:行者123 更新时间:2023-12-04 16:45:53 28 4
gpt4 key购买 nike

大多数第三方 Python 库都会抛出自定义异常。其中许多异常都有其自身的依赖性和副作用。例如,考虑以下情况:

class ThirdPartyException(BaseException):
def __init__(self):
print("I do something arcane and expensive upon construction.")
print("Maybe I have a bunch of arguments that can't be None, too.")

def state(self) -> bool:
# In real life, this could be True or False
return True

此外,假设我绝对必须处理这个异常,为此,我需要查看异常的状态。如果我想编写测试来检查处理此异常时的行为,我必须能够创建ThirdPartyException。但我可能连怎么做都想不出来,更不用说如何廉价地做到了。

如果这不是Exception 而我想编写测试,我会立即使用MagicMock。但是我不知道如何使用 MagicMock 异常。

如何测试以下代码中的错误处理情况,最好使用 py.test

def error_causing_thing():
raise ThirdPartyException()

def handle_error_conditionally():
try:
error_causing_thing()
exception ThirdPartyException as e:
if state:
return "Some non-error value"
else:
return "A different non-error value"

最佳答案

我知道这是一个陈旧的问题,我没有使用 pytest,但我在 unittest 中遇到了类似的问题,并且刚刚找到了一个其他人可能会觉得有用的解决方案。我使用 new 关键字为我的自定义异常添加了一个 patch,该关键字具有任何类的值,该类是 Exception 的子类(或者是 异常类):

import unittest
from unittest import TestCase
from unittest.mock import patch
# ... other imports required for these unit tests

class MockCustomException(Exception):
def state(self):
return self.__class__.state_return_value

class MyTestCase(TestCase):
def setUp(self):
custom_exception_patcher = patch(
'path.to.CustomException',
new=MockCustomException
)
custom_exception_patcher.start() # start patcher
self.addCleanup(custom_exception_patcher.stop) # stop patch after test

def test_when_state_true(self):
MockCustomException.state_return_value = True
self.assertEqual(handle_error_conditionally(), "Some non-error value")

def test_when_state_false(self):
MockCustomException.state_return_value = False
self.assertEqual(handle_error_conditionally(), "A different non-error value")

通过使用 patch 作为装饰器或上下文管理器,也可以在每次测试的基础上使用此方法:

# ... imports, etc
class MockCustomExceptionStateTrue:
def state(self):
return True

@patch('path.to.CustomException', new=MockCustomExceptionStateTrue)
def test_with_decorator_patch(self):
self.assertEqual(handle_error_conditionally(), "Some non-error value")

def test_with_context_manager(self):

class MockCustomException:
def state(self):
return True

with patch('path.to.CustomException', new=MockCustomException):
self.assertEqual(handle_error_conditionally(), "Some non-error value")

希望这对某人有帮助!!在简单浏览了 pytest 文档之后,看起来 monkeypatching 类似于 unittest 补丁功能

关于python - 在 Python 中模拟自定义异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52681322/

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