Часть 1: Основы
from mock import Mock
Mock-объект - это объект, который является своего рода Dummy
для кода, который
мы хотим, чтобы не выполнялись, но для которых мы хотим знать некоторую информацию (количество вызовов, аргументы вызова). Также нам может потребоваться указать возвращаемое значение для этого кода.
Давайте определим простую функцию:
def foo(value):
return value + value
Теперь мы готовы создать объект Mock для него:
mock_foo = Mock(foo, return_value='mock return value')
Теперь мы можем проверить это:
>>> foo(1)
2
>>> mock_foo(1)
'mock return value'
И получите информацию о звонках:
>>> mock_foo.called
True
>>> mock_foo.call_count
1
>>> mock_foo.call_args
((1,), {})
Доступные атрибуты экземпляра Mock ():
call_args func_code func_name
call_args_list func_defaults method_calls
call_count func_dict side_effect
called func_doc
func_closure func_globals
Они говорят сами за себя.
Часть 2: @patch
Декоратор
Декоратор @patch
позволяет нам легко создавать фиктивные объекты для импортируемых объектов (классов или методов). Это очень полезно при написании юнит-тестов.
Предположим, что у нас есть следующий модуль foo.py
:
class Foo(object):
def foo(value):
return value + value
Давайте напишем тест для @patch decorator.
Мы собираемся пропатчить метод foo
в классе Foo
из модуля foo
. Не забывайте импорт.
from mock import patch
import foo
@patch('foo.Foo.foo')
def test(mock_foo):
# We assign return value to the mock object
mock_foo.return_value = 'mock return value'
f = foo.Foo()
return f.foo(1)
Теперь запустите:
>>> test()
'mock return value'
Вуаля! Наш метод успешно переопределен.