PropertyMock с изменением значений после каждого вызова - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь смоделировать 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)

1 Ответ

1 голос
/ 05 марта 2020

Редактирование на основе уточнения :

Думаю, вы можете реализовать итератор:

class MyDescription():

    descriptions = iter([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

    def __iter__(self):
        for description_list in self.descriptions:
            for description in description_list:
                yield description
            raise StopIteration
type(fake_cursor).description = PropertyMock(return_value=MyDescription())

Так это будет выглядеть так:

>>> z = MyDescription()
>>> [i for i in z]
[1, 2, 3]
>>> [i for i in z]
[4, 5, 6]
>>> [i for i in z]
[7, 8, 9]
>>>
...