如何为Python函数编写单元测试用例
我有下面的代码设置,我有一个测试用例来测试如何为Python函数编写单元测试用例,python,python-3.x,unit-testing,mocking,Python,Python 3.x,Unit Testing,Mocking,我有下面的代码设置,我有一个测试用例来测试Db.\uuuu init\uuuuu,如何测试\uuu del\uuuu?你能举个例子吗 import psycopg2 class Db(object): def __init__(self): import app conn_string = "host='{}' port='{}' dbname='{}' user='{}' password='{}'".format(app.app.config['D
Db.\uuuu init\uuuuu
,如何测试\uuu del\uuuu
?你能举个例子吗
import psycopg2
class Db(object):
def __init__(self):
import app
conn_string = "host='{}' port='{}' dbname='{}' user='{}' password='{}'".format(app.app.config['DB_HOST'], \
app.app.config['DB_PORT'], app.app.config['DB_NAME'], app.app.config['DB_USER'], \
app.app.config['DB_PASSWORD'])
self.conn = psycopg2.connect(conn_string)
def __del__(self):
self.conn.close()
测试用例
@ddt
class TestDB(unittest.TestCase):
@patch('psycopg2.connect')
def test_db_constructor(self, mock_psycopg2_connect):
mock_psycopg2_connect.returned_value = True
db = Db()
self.assertTrue(db.conn)
通过
\uuu init\uuu
方法模拟出self.conn
后,直接调用该方法:
@patch('psycopg2.connect')
def test_db_destructor(self, mock_psycopg2_connect):
db = Db()
mock_conn = mock_psycopg2_connect.return_value
close = mock_conn.close
db.__del__()
close.assert_called_once()
你最初的测试有一个缺陷;您拼错了return\u value
,因此您的模拟连接永远不会返回True
;它返回一个新的模拟对象。该模拟对象恰好有一个真值:
>>> from unittest.mock import MagicMock
>>> mock = MagicMock()
>>> mock.connect()
<MagicMock name='mock.connect()' id='4536051752'>
>>> bool(mock.connect())
True
如果您有输入错误,它应该是
mock\u psycopg2\u connect.return\u value
。您不应该使用\u del\u
(请参阅)。也许你可以用一个简单的方法解决你的问题。
@patch('psycopg2.connect')
def test_db_constructor(self, mock_psycopg2_connect):
mock_conn = mock_psycopg2_connect.return_value
db = Db()
self.assertTrue(db.conn is mock_conn)