2017-05-17 11 views
0

私は以下のコードをセットアップしましたが、すでにDb.__init__をテストするためのテストケースがあります。どうすれば__del__をテストできますか?あなたは例を挙げることができますか?Python __del__関数のユニットテストケースの記述方法

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) 
+0

あなたはタイプミスがあります。これは 'mock_psycopg2_connect.return_value'である必要があります。 –

+0

あなたは '__del__'を使用すべきではありません([この回答](http://stackoverflow.com/questions/1481488/what-is-the-del-method-how-to-call-it/2452895#2452895) )。おそらく、あなたは問題を['with'ステートメント](http://effbot.org/zone/python-with-statement.htm)で解決することができます。 –

答えて

1

だけ__init__メソッドを介して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_valueのスペルが間違っていますので、模擬接続は決してTrueを返します。新しいモックオブジェクトを返します。

:適切にその属性がどのようなモックを返すとまったく同じオブジェクトである場合 connect()メソッドの戻り値は db.conn、テストに格納されていることをテストするには

>>> from unittest.mock import MagicMock 
>>> mock = MagicMock() 
>>> mock.connect() 
<MagicMock name='mock.connect()' id='4536051752'> 
>>> bool(mock.connect()) 
True 

:それモックオブジェクトは、ちょうど真の値を持つようにをたまたま

@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) 
関連する問題