我正在尝试测试一个包含“engine.connect()”的 try- except 块的函数,并捕获 SQLAlchemy exc.OperationalError 或 AttributeError。前一个例外是捕获用于构建 URL 对象的不正确凭据,该对象又用于构建引擎(错误的用户名、主机名、数据库名称等)。后者是在将引擎对象以外的对象传递给函数时进行捕获。我对 pytest 不熟悉,并且无法找到一种仍然会为不正确的 URL 返回适当的 exc.OperationalError 的方法,如果这甚至是首选方法的话。据我所知,我不想在测试中实际连接到云 postgres 数据库,但不确定如何以在给定替代输入的情况下仍会引发正确异常的方式复制外部连接。这里的标准是什么?
def verify_engine_connection(engine):
try:
engine.connect()
except exc.OperationalError as e:
# Use regex to narrow down which credential is incorrect, and then log
raise
except AttributeError as e:
log.critical('Function did not receive engine object, raised AttributeError: ' + str(e))
raise
except Exception as e:
log.critical('Could not verify engine connection due to unexpected exception: ' + str(e))
raise
必须使用猴子补丁进行测试通常是被测代码中存在耦合的标志(在现实世界的开发时间范围内,删除耦合可能需要付出更多的努力,而不是值得的)。
幸运的是,您的单元是一个函数,它调用作为其参数传递的对象上的方法,因此您不需要猴子补丁。
只需创建一个具有触发测试用例行为的类并将其传递进去。
class FailingEngine:
def connect(self):
raise AttributeError('test')
def test_engine_connect_attribute_error():
verify_engine_connection(FailingEngine())