Я пытаюсь смоделировать psycopg2 и мне нужно обработать курсор. Описание
# run query 1
column_names = [desc[0] for desc in cursor.description]
# run query 2
# NB cursor.description now returns different value
column_names = [desc[0] for desc in cursor.description]
Я могу сделать это через PropertyMock:
type(fake_cursor).description = PropertyMock(return_value=descriptions[0])
, но это не решает мою проблема в том, что тестируемая система выполняет два запроса, и описание во второй раз будет другим.
Как изменить возвращаемое значение макета при втором вызове?
Я пытался:
cursor_execute_call_count = 0
def handle_cursor_execute(arg1, arg2):
cursor_execute_call_count = cursor_execute_call_count + 1
type(fake_cursor).description = PropertyMock(return_value=descriptions[cursor_execute_call_count])
fake_cursor.execute = Mock(side_effect=handle_cursor_execute)
Но я получаю
E UnboundLocalError: local variable 'cursor_execute_call_count' referenced before assignment
(Это не имеет смысла для меня. Должно быть, происходит странная проблема с ограничением объема.)
Я сделал в конечном итоге заставить его работать с этим кодом, но кажется, что должен быть лучший способ:
def handle_cursor_execute(arg1, arg2):
description = descriptions.pop()
type(fake_cursor).description = PropertyMock(return_value=description)