我有一个数据库类,这个类包含一个用于插入记录的方法。这是方法的外观:
def insertRecord(self, **kwargs):
if 'table' not in kwargs.keys():
raise Exception('The table keyword is required')
table = kwargs['table']
del kwargs['table']
query_fields = kwargs.keys()
pg_fields = []
for field in query_fields:
pg_fields.append('%(' + field + ')s')
query_field_string = ', '.join(query_fields)
query_pg_string = ', '.join(pg_fields)
self.cur.execute('INSERT INTO ' + table + '(' +
query_field_string + ') VALUES (' + query_pg_string + ')',
kwargs
)
self.conn.commit()
该方法接受变量参数列表,以便用户可以使用此方法在任何表中插入条目。从本质上讲,该方法是构造INSERT INTO <table>(<field1>, <field2>...) VALUES (%(field1)s, %(field2)s...)
形式的查询字符串,因为execute
方法接受形式<field>: <value>
的字典的所有字符串%(字段)作为第二个参数的字典)s将被替换为相应的值。
基本上,该方法工作正常,但我不知道应该如何测试它。我应该创建一个测试数据库,并在调用后查看传递给它的值是否在数据库中?你会如何为这种方法编写测试?
答案 0 :(得分:0)
重构代码以格式化SQL命令,然后测试 。通过这种方式,它更加简单 - 传入args,获取格式化的字符串和字典。不需要嘲笑。
# python -m unittest insertrec
import unittest
def formatInsert(table, **kwargs):
assert table
query_fields = kwargs.keys()
pg_fields = []
for field in query_fields:
pg_fields.append('%(' + field + ')s')
query_field_string = ', '.join(query_fields)
query_pg_string = ', '.join(pg_fields)
return (
'INSERT INTO ' + table + '(' +
query_field_string + ') VALUES (' + query_pg_string + ')',
kwargs
)
class TestInsert(unittest.TestCase):
def test_err_notable(self):
self.assertRaises(AssertionError, formatInsert, None)
def test_insert1(self):
self.assertEquals(
formatInsert('mytab', beer='tasty'),
('INSERT INTO mytab(beer) VALUES (%(beer)s)',
{'beer': 'tasty'}
),
)