2017-05-17 1 views
0

Ich habe den folgenden Code-Setup, und ich habe einen Testfall, um die Db.__init__ bereits zu testen, wie teste ich die __del__? Können Sie ein Beispiel geben?Wie Einheit Testfall für Python schreiben __del__ Funktion

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() 

Test Case

@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

Sie haben einen Tippfehler, es sollte 'mock_psycopg2_connect.return_value' sein. –

+0

Sie sollten '__del__' nicht verwenden (siehe [diese Antwort] (http://stackoverflow.com/questions/1481488/what-is-the-del-method-how-to-call-it/2452895#2452895)). Vielleicht könntest du dein Problem mit einem ['with' Statement] (http://effbot.org/zone/python-with-statement.htm) lösen. –

Antwort

1

Nur die Methode direkt aufrufen, verspottet zu haben self.conn über die __init__ Methode aus:

@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() 

Ihr Original-Test hat einen Fehler; Sie haben return_value falsch geschrieben, so dass Ihre mock connect nie True zurückgibt; Es gibt ein neues Mock-Objekt zurück. Das Mock-Objekt nur geschieht einen wahren Wert haben:

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

Um richtig zu testen, dass der connect() Methode Rückgabewert in db.conn gespeichert ist, zu testen, ob das Attribut ist genau die gleiche Objekt wie das, was die Mock-Rückkehr:

@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) 
Verwandte Themen