我具有以下函数,该函数产生pyodbc.connect()
要与with
语句一起使用的对象:
from contextlib import contextmanager
import pyodbc
@contextmanager
def get_db_connection(conn_string, **kwargs):
try:
conn = pyodbc.connect(conn_string, **kwargs)
yield conn
except Exception as connection_error:
raise ValueError('Could not connect to db.', connection_error) from None
finally:
conn.close()
我想为此功能编写单元测试,以测试可以打开,关闭连接,并在发生错误时ValueError
引发a。我有:
from unittest.mock import Mock, patch
from db.query import get_db_connection
@patch('db.query.pyodbc.connect')
def test_get_db_connection(self, mock_connect):
conn_string = Mock()
with get_db_connection(conn_string) as conn:
pass
# print(conn) is acceptable here and prints:
# <MagicMock name='connect()' id='2595126451264'>
mock_connect.assert_called_once()
mock_connect.side_effect = Exception()
def _t():
with get_db_connection(conn_string) as conn:
pass
self.assertRaises(UnboundLocalError, _t)
此处的所有内容都会运行并通过,但是我注意到在关闭语句范围conn
之后,可用with
。
如何编写使用的单元测试,get_db_connection()
以mock
使conn
变量的行为符合我的期望?还是有另一种方法可以对它进行充分的单元测试?
采用
conn.close.assert_not_called()
检查连接是否在第一个with
块中打开。conn.close.assert_called_once()
在第一个with
块之后检查连接是否关闭。try
块中发生错误时,已经存在没有建立连接的检查-UnboundLocalError:分配前引用了本地变量'conn'本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句