2014-01-13 2 views
5

Я уже несколько лет использую Django, но недавно решил попробовать Flask для нового API. Благодаря Carl Meyers прекрасное представление о testing Django в PyCon, я использую следующий метод для предотвращения прикосновения к базе данных в моих модульных тестов Django:Предотвращение касания db во время модульного тестирования с помощью SQLAlchemy

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''' 
    ... 

Мой вопрос может кто-нибудь сказать мне, как сделать это же основной техника с SQLAlchemy? Другими словами, я хочу, чтобы в любой момент я запускал запрос к базе данных для создания ошибки времени выполнения.

ответ

4

Вы можете использовать для этого SQLAlchemy event system, что позволяет использовать обратный вызов, когда SQLAlchemy выполняет различные события.

В вашем случае вы, вероятно, захотите использовать события before_execute() или before_cursor_execute(). Например ...

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

Благодарим за ответ! Я буду тестировать, и если это сработает, я выберу в качестве ответа. Если этого не произойдет, я буду уведомлять через комментарий. –

Смежные вопросы