Более чистый подход к издевательству над объектом с помощью асинхронных методов в Python без необходимости вручную назнаPython

Программы на Python
Ответить
Anonymous
 Более чистый подход к издевательству над объектом с помощью асинхронных методов в Python без необходимости вручную назна

Сообщение Anonymous »

Я хочу имитировать объект, для большинства методов я могу сделать что-то вроде этого:

Код: Выделить всё

foo.object = Mock(spec=MyObject)
foo.object.method1.return_value = my_value
foo.object.method2.return_value = some_other_value
Это работает отлично, пока я не доберусь до асинхронного метода. Если я попытаюсь установить .return_value для этого метода, я получу ошибку при вызове метода, в которой будет сказано, что я не могу вызвать await для типа значения, которое я установил для return_value; по сути, он пытается вернуть return_type, как если бы это был обычный метод, вместо возврата ожидаемой сопрограммы.
Я могу схитрить, выполнив что-то вроде этого:

Код: Выделить всё

foo.object = Mock(spec=MyObject)
foo.object.async_method = AsyncMock()
foo.object.async_method.return_value = whatever
Но это лишает смысла назначать спецификацию моему макетному объекту, поскольку мне все равно приходится вручную назначать каждый асинхронный метод.
Это есть ли способ получить более разумный подход, при котором издевательство над моим объектом автоматически назначает Mocks обычным методам в спецификации и назначает AsyncMock асинхронным методам из спецификации?

Подробнее здесь: https://stackoverflow.com/questions/793 ... t-having-t
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»