Python менеджер контекста патча для возврата объекта - PullRequest
2 голосов
/ 13 февраля 2020

Я пытаюсь исправить менеджер контекста, который выполняет поиск в базе данных и возвращает объект следующим образом:

class MyClass:
    @contextlib.contextmanager
    def client_ctx(self, id):
         # hidrate from DB and yield object
         yield client # instance of SQAlchemy model Client

    def run(self, id):
        with self.client_ctx(id) as cl:
            # do work here

Класс клиента в этом случае является моделью SQLAlchemy.

В моем тесты Я пытаюсь пропатчить этот метод client_ctx, чтобы просто вернуть объект, созданный в тестах, как это:

@patch('MyClass.client_ctx')
def test_ctx(self, _mocked_ctx_manager):
    myclass = MyClass()

    client = Client(
        id=1,
        code='test-client')

    _mocked_ctx_manager.__enter__.return_value = client
    myclass.run(1)

Я получаю: TypeError: Object of type MagicMock is not JSON serializable, что не имеет смысла для меня. Что я делаю не так, есть ли лучший способ издеваться над менеджером контекста?

1 Ответ

1 голос
/ 13 февраля 2020

Должно работать следующее:

_mocked_ctx_manager.return_value.__enter__.return_value = client

Ваш _mocked_ctx_manager возвращает менеджер контекста. Поэтому вам нужно установить __enter__.return_value из _mocked_ctx_manager.return_value.

. Мне показалась полезной следующая статья: Surrender Python Насмешка! У меня есть ты сейчас.

...