如何编写用于插入查询的泛型方法的测试

时间:2014-08-20 17:31:19

标签: python testing

我有一个数据库类,这个类包含一个用于插入记录的方法。这是方法的外观:

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将被替换为相应的值。

基本上,该方法工作正常,但我不知道应该如何测试它。我应该创建一个测试数据库,并在调用后查看传递给它的值是否在数据库中?你会如何为这种方法编写测试?

1 个答案:

答案 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'}
             ),
        )