Использование Mock() в Python
можете ли вы привести некоторые четкие примеры использования Mock () в Джанго unittests? Я хочу понять это более ясно.
обновление: я выяснил некоторые вещи, поэтому я разделяю его ниже.
2 ответов
Часть 1: Основы
from mock import Mock
макет объекта является объектом, который является своего рода Dummy
для кода, который
мы не хотим быть выполнены, но для чего мы хотим знать некоторую информацию (количество вызовов, аргументы вызова). Также мы можем указать возвращаемое значение для этого кода.
давайте определим простую функцию:
def foo(value):
return value + value
теперь мы готовы создать макет объекта для этого:
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'
вуаля! Наш метод успешно преодолен.
макет сайта имеет очень хорошую документацию API, которая охватывает все это. Обратите внимание, что patch заменяет все экземпляры foo.Foo.foo
где бы они ни назывались. Это не предпочтительный способ издеваться над чем-то, но может быть единственным способом-см. open().