“Pythonic”方式进行适当的单元测试取决于pyodbc所做SQL查询的功能。最佳方法是模拟返回来自SQL服务器的输出的函数。问题在于,模拟应该返回什么?
我的设置:
在lib1中:
在lib2中:
我提出了以下解决方案:
“然而,有一些pyodbc的补充使它们非常方便:”
- 值可以通过列名访问。 - 即使在关闭游标后,也可以访问Cursor.description值。 - 值可以被替换。 - 来自同一select语句的行共享内存。
因此,似乎namedtuple实际上与pyodbc.Row(在访问值方面)表现相同。是否有更pythonic的方法来对pyodbc.Row进行单元测试?能否假设这是一个好的Mock?
def selectSQL(connection, query):
cursor = connection.cursor()
cursor.execute(query)
return cursor.fetchall()
在lib2中:
def function_to_be_tested(cxnx):
my_query = "SELECT r1, r2 FROM t1"
rows = lib1.selectSQL(cxnx, my_query)
# do someting with the rows like:
a = 0
for row in rows
a += row.r1 * row.r2
return a
我提出了以下解决方案:
- 将lib1.selectSQL(cxnx, my_query)打印到文件中
- 将lib1.selectSQL中的数据插入到namedtuple中
,
out_tuple = namedtuple('out1', ["r1", "r2"])
printed_data = [(1,2),(2,3)]
out = [out_tuple(*row) for row in printed_data]
def test_mockSelectSQL(self):
piotrSQL.selectSQL = MagicMock()
piotrSQL.selectSQL.side_effect = [out]
self.assertEqual(lib2.function_to_be_tested(True), 7)
我唯一的担忧是模拟返回的是namedtuple而不是原始函数中的pyodbc.Row。我查看了以下网站,以寻找有关如何正确创建pyodbc.Row的信息:
- https://github.com/mkleehammer/pyodbc/blob/master/tests2/informixtests.py
- https://github.com/mkleehammer/pyodbc/wiki/Row
“然而,有一些pyodbc的补充使它们非常方便:”
- 值可以通过列名访问。 - 即使在关闭游标后,也可以访问Cursor.description值。 - 值可以被替换。 - 来自同一select语句的行共享内存。
因此,似乎namedtuple实际上与pyodbc.Row(在访问值方面)表现相同。是否有更pythonic的方法来对pyodbc.Row进行单元测试?能否假设这是一个好的Mock?
您还可以提供特殊名称 :memory:,以在 RAM 中创建数据库。
- Nullman