Python mocking эластичный поиск генератора соединений `с оператором` - PullRequest
0 голосов
/ 15 ноября 2018

Я хотел бы протестировать класс с функцией, в которой есть оператор with:

func_to_test():
   ....
   with self.__elastic_generator.get() as es:
      print 'about to use the es connection....'

Итак, я издевался над elstic_generator, и я высмеивал его get функция при создании тестируемого класса:

elastic_gen = mock.Mock()
elstic_gen.get = mock.Mock()
elastic_gen.get.side_effect = ['mocked elastic connection']
tested_class = TestedClass(elastic_gen)
tested_class.func_to_test()

Но по какой-то причине это не работает при использовании оператора with. Однако, если вы получаете соединение без использования with, вот так:

x = self.__elastic_generator.get()

Тогда все работает нормально, и я получаю x = 'mocked elastic connection'.

Так что я думаю, что проблема связана с некоторыми вызовами функций, которые выполняются при использовании with, и что я не высмеиваю эти функции.

Может кто-нибудь объяснить, что происходит под капотом и что еще я должен издеваться, чтобы иметь возможность проверить это с помощью оператора with?

Спасибо.

1 Ответ

0 голосов
/ 15 ноября 2018

Оператор with - это концепция, известная как менеджер контекста. Диспетчер контекста имеет функцию __enter__ для входа в with и функцию __exit__ для выхода из with (путем повышения или завершения выполнения внутри блока).

Функция __enter__ должна возвращать значение того, что вы ожидаете присвоить переменной после as, которое в этом случае будет es. Таким образом, чтобы смоделировать это, вы не хотите высмеивать возвращаемое значение .get(), вы хотите смоделировать возвращаемое значение .get().__enter__(). Это должно выглядеть так:

elastic_gen = mock.Mock()
elastic_gen.return_value.__enter__.return_value = 'mocked elastic connection'
...