如何为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)