2014-01-13 9 views
5

Ich benutze Django seit mehreren Jahren, aber habe kürzlich beschlossen, Flask für eine neue API auszuprobieren. Dank Carl Meyers hervorragende Präsentation auf testing Django bei PyCon, ich habe die folgende Technik wurde mit der Datenbank in meinen Django Unit-Tests zu verhindern, berühren:Verhindern, db während des Komponententests mit SQLAlchemy zu berühren

cursor_wrapper = Mock() 
cursor_wrapper.side_effect = RuntimeError("No touching the database!") 

@patch('django.db.backends.util.CursorWrapper', cursor_wrapper) 
class TestPurchaseModel(TestCase): 
    '''Purchase model test suite''' 
    ... 

Meine Frage ist, kann mir jemand sagen, wie man diesen gleichen Grund tun Technik mit SQLAlchemy? Mit anderen Worten, ich möchte jederzeit eine Abfrage gegen die Datenbank ausführen, um einen Laufzeitfehler zu erzeugen.

Antwort

4

Sie können hierfür SQLAlchemy's event system verwenden, das ermöglicht, einen Rückruf zu verwenden, wenn SQLAlchemy verschiedene Ereignisse ausführt. In Ihrem Fall möchten Sie wahrscheinlich die Ereignisse before_execute() oder before_cursor_execute() verwenden. Zum Beispiel ...

from sqlalchemy import event 

class TestCase(unittest.TestCase): 
    def setUp(self): 
     engine = ... # create or access your engine somehow 
     event.listen(engine, "before_cursor_execute", self._before_cursor_execute) 

    # We can also clean up the event handler after the test if we want to 
    def tearDown(self): 
     engine = ... # access your engine again 
     event.remove(engine, "before_cursor_execute", self._before_cursor_execute) 

    def _before_cusor_execute(self, conn, cursor, statement, parameters, context, executemany): 
     raise RuntimeError('No touching the database!') 
+0

Vielen Dank für die Antwort! Ich werde testen, und wenn es funktioniert, werde ich als Antwort auswählen. Wenn nicht, werde ich per Kommentar benachrichtigen. –

Verwandte Themen