0
我想编写一个单元测试,可以确保函数调用中的SQL语句是正确的。它应该测试这个调用的执行。然后,我想嘲笑调用提交,以便不会插入数据库。我正在使用psycopg2进行测试。嘲笑一个类的一个功能
我有这样一个功能:
def test_insert(a, b, c):
con = psycopg2.connect(os.environ['PGDB'])
cur = con.cursor()
cur.execute('insert into test_table values ({a}, {b}, {c})'.format(a=a, b=b, c=c))
con.commit()
con.close()
调用test_insert(1,2,3)
当我看到插入到表中的行。现在我试图嘲笑这个电话。到目前为止,我采取了几种方法:
@mock.patch('psycopg2.connect')
def test(mock_connect, a, b, c):
mock_con = mock_connect.return_value
mock_con.commit.return_value = None
insert_row(a, b, c)
这似乎工作,但实际上并没有调用执行语句。 test_insert(1,4,'xyz')
失败,例如test(1,4,'xyz')
没有。接下来,我想嘲笑刚刚提交连接类的方法psycopg2:
@mock.patch('psycopg2.extensions.connection.commit')
def test_insert(mock_commit, a, b, c):
mock_commit.return_value = None
insert_row(a,b,c)
但是这给了我一个语法错误
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/a/.virtualenv/test/lib/python2.7/site-packages/mock/mock.py", line 1318, in patched
patching.__exit__(*exc_info)
File "/home/a/.virtualenv/test/lib/python2.7/site-packages/mock/mock.py", line 1480, in __exit__
setattr(self.target, self.attribute, self.temp_original)
TypeError: can't set attributes of built-in/extension type 'psycopg2.extensions.connection'
有没有做什么,我试图做一个好办法?
提问者是不是要修补环境变量或'connect'。他们正在尝试补丁'commit'。 – user2357112
@ user2357112我得到yur点,我认为,因为它是一个单元测试你不想有外部依赖。这就是为什么我建议既要检查“函数调用是否是正确的”,也要嘲笑调用提交,因为'psycopg2.connect'调用是一个模拟 –