Мы использовали Mock для Python некоторое время.
Теперь у нас есть ситуация, в которой мы хотим смоделировать функцию
def foo(self, my_param):
#do something here, assign something to my_result
return my_result
Обычно, способ посмеяться над этим будет (при условии, что foo является частью объекта)
self.foo = MagicMock(return_value="mocked!")
Даже если я вызываю foo () пару раз, я могу использовать
self.foo = MagicMock(side_effect=["mocked once", "mocked twice!"])
Теперь я сталкиваюсь с ситуацией, в которой я хочу вернуть фиксированное значение, когда входной параметр имеет конкретное значение. Итак, если, скажем, «my_param» равно «что-то», то я хочу вернуть «my_cool_mock»
Похоже, это доступно на mockito для python
when(dummy).foo("something").thenReturn("my_cool_mock")
Я искал, как добиться того же с Mock без успеха?
Любые идеи?
python
unit-testing
mocking
mockito
Хуан Антонио Гомес Мориано
источник
источник
monkeypatch
. Monkeypatch больше подходит для «замены этой функции ради тестирования», тогда как Mock - это то, что вы используете, когда вы также хотите проверитьmock_calls
или сделать утверждения о том, с чем она была вызвана, и так далее. Есть место для обоих, и я часто использую оба в разное время в данном тестовом файле.Ответы:
http://www.voidspace.org.uk/python/mock/mock.html#calling
источник
side effect
это точный термин: en.wikipedia.org/wiki/Side_effect_(computer_science)CallableMixin.side_effect
, а на то, что отдельная функция, определенная в примере, имеет то же имя.Как указано в Python Mock объект с методом, вызываемым несколько раз
Решение состоит в том, чтобы написать свой собственный побочный эффект
Это делает трюк
источник
Побочный эффект принимает функцию (которая также может быть лямбда-функцией ), поэтому для простых случаев вы можете использовать:
источник
Я закончил здесь поиском « как смоделировать функцию на основе входных аргументов » и наконец решил эту проблему, создав простую вспомогательную функцию:
Сейчас:
Надеюсь, это кому-нибудь поможет!
источник
Вы также можете использовать
partial
from,functools
если хотите использовать функцию, которая принимает параметры, а функция, над которой вы работаете, - нет. Например, вот так:Это вернет вызываемый объект, который не принимает параметры (как timezone.now () Django), но моя функция mock_year принимает.
источник
got multiple values for argument
.Просто чтобы показать другой способ сделать это:
источник
Вы также можете использовать
@mock.patch.object
:Скажем, модуль
my_module.py
используетpandas
для чтения из базы данных, и мы хотели бы протестировать этот модуль методом насмешкиpd.read_sql_table
(который принимает вtable_name
качестве аргумента).Что вы можете сделать, это создать (внутри вашего теста)
db_mock
метод, который возвращает разные объекты в зависимости от предоставленного аргумента:В своей тестовой функции вы затем делаете:
источник
Если вы «хотите вернуть фиксированное значение, когда входной параметр имеет определенное значение» , возможно, вам даже не нужен макет, и вы могли бы использовать метод
dict
наряду с егоget
методом:Это хорошо работает, когда вывод вашей подделки является отображением ввода. Когда это функция ввода, я бы предложил использовать
side_effect
в соответствии с ответом Амбер .Вы также можете использовать комбинацию обоих, если хотите сохранить
Mock
возможности (assert_called_once
иcall_count
т. Д.):источник
Я знаю, это довольно старый вопрос, может помочь как улучшение с использованием Python lamdba
источник