Использование 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().