2014-02-17 5 views
2

Я интегрирую mockito с python unittest. Я новичок в unittest, но, конечно, не новичок в модульной парадигме тестирования. Я хотел использовать mockito для укусов и издевательств над классами. Я не мог найти хорошую документацию по интеграции и использованию mockito python-unittest.Интеграция python mockito с python unittest

Является ли mockito лучшим способом для этого?

Каковы его последствия?

Может ли кто-нибудь помочь мне в этом?

+0

ли есть причина, по которой вы не хотите использовать библиотеку [mock] (http://www.voidspace.org.uk/python/mock/)? Это часть стандартной библиотеки unittest, начиная с python 3.3 (unittest.mock). – msvalkon

+0

Я использую python 2.6 и 2.7 –

+1

Не имеет значения, вы можете 'pip install mock'. Дело в том, что, поскольку он достаточно зрел, чтобы быть включенным в стандартную библиотеку для python 3.3, вы, вероятно, столкнетесь с меньшими проблемами и попросите более широкую аудиторию людей ответить на ваши вопросы. – msvalkon

ответ

0

Я нашел документацию для макета легче понять, чем для mockito. И теперь это часть стандартной библиотеки.

Python mockito lilbrary пытается переделать библиотеку mokito Java. Таким образом, это полезно для людей, которые работают с Java и с Python, в то же время tp упрощает работу. Если вы не работаете с Java mockito или нет, я не вижу причин идти по этому пути.

Возможно, ваш ответ заключается в том, чтобы использовать насмешку, потому что вы спрашиваете: «Является ли mockito лучшим способом для этого?»

Из документации: http://www.voidspace.org.uk/python/mock/getting-started.html#using-mock


Простой ProductionClass ниже имеет более близкий метод. Если он вызывается с объектом, он нажимает на него.

>>> class ProductionClass(object): 
...  def closer(self, something): 
...   something.close() 
... 

Чтобы проверить это, нам нужно передать объект с близким методом и проверить, что он был вызван правильно.

>>> real = ProductionClass() 
>>> mock = Mock() 
>>> real.closer(mock) 
>>> mock.close.assert_called_with() 

Часто вы хотите отслеживать более одного вызова метода. Атрибут mock_calls записывает все обращения к дочерним атрибутам макета, а также их детям.

>>> mock = MagicMock() 
>>> mock.method() 
<MagicMock name='mock.method()' id='...'> 
>>> mock.attribute.method(10, x=53) 
<MagicMock name='mock.attribute.method()' id='...'> 
>>> mock.mock_calls 
[call.method(), call.attribute.method(10, x=53)] 

Если вы делаете утверждение о mock_calls и неожиданных методов были названы, то утверждение не удастся.Это полезно, потому что, так же как и утверждение, что ожидаемые вами звонки были сделаны, вы также проверяете, что они были сделаны в правильном порядке и без дополнительных вызовов:

Вы используете объект вызова для построения списков для сравнения с mock_calls:

>>> expected = [call.method(), call.attribute.method(10, x=53)] 
>>> mock.mock_calls == expected 
True 

Установка значения возврата на макете объекта тривиально проста:

>>> mock = Mock() 
>>> mock.return_value = 3 
>>> mock() 
3 

конечно, вы можете сделать то же самое для методов на издеваться:

>>> mock = Mock() 
>>> mock.method.return_value = 3 
>>> mock.method() 
3 

Возвращаемое значение также может быть установлен в конструкторе:

>>> mock = Mock(return_value=3) 
>>> mock() 
3 

Если вам нужна настройка на вашем издеваться атрибут, просто сделать это:

>>> mock = Mock() 
>>> mock.x = 3 
>>> mock.x 
3