Использование Mock () в Python - PullRequest
       3

Использование Mock () в Python

7 голосов
/ 26 сентября 2011

Можете ли вы привести некоторые наглядные примеры использования Mock () в юнит-тестах Django? Я хочу понять это более четко.

Обновление: Я кое-что выяснил, поэтому делюсь этим ниже.

Ответы [ 2 ]

14 голосов
/ 02 октября 2011

Часть 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'

Вуаля! Наш метод успешно переопределен.

1 голос
/ 05 декабря 2011

На сайте Mock есть очень хорошая документация по API, которая охватывает все это.Обратите внимание, что patch заменяет все экземпляры foo.Foo.foo, где бы они ни вызывались.Это не предпочтительный способ издеваться над чем-то, но может быть единственным - см. Open ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...