2013-11-12 2 views
3

Прежде всего, я действительно хочу понять, ПОЧЕМУ я должен использовать насмешку (библиотека Python Mock).Python mocking- понять концепцию и необходимость

В чем разница между быстрым созданием маленького объекта для проверки чего-либо и использованием макетного объекта?

В чем преимущества насмешивания над другими методами (мне действительно нужны некоторые «живые» примеры, чтобы понять это)? В некоторых случаях это насмешливо важно?

Также: в чем разница между макетным объектом и объектом magicmock? Как они соединяются?

Вторая вещь - ЧТО/ГДЕ, чтобы издеваться.

Должен ли я высмеивать, например, результаты запроса базы данных? Я имею в виду: всегда ли издевательские данные должны быть удаленным?

tl; dr: Пожалуйста, объясните насмешливую концепцию в Python тем, кто никогда не использовал ее на любом языке.

+0

Возможный дубликат: http://stackoverflow.com/questions/1414032/why-create-mock-objects?rq=1 –

+1

Но нет ничего о Python там, хотя он имеет небольшую часть ответов. Кроме того, примеров здесь не так уж много. Мое положение дел: я никогда не употреблял насмешек, теперь я должен издеваться над вещами, используя Python. Мне нужно что-то вроде «Mocking in Python for dummies»;) – user2091046

+0

@ user2091046 +1 потому что у меня есть эти вопросы. Но на самом деле, это похоже на пять вопросов в одном, возможно, должно было быть разделено. Например, http://stackoverflow.com/questions/4370617/hard-coded-mock-objects-vs-mocking-framework – neuronet

ответ

2

Поддельный объект предназначен для быстрого и легкого представления сложного объекта без необходимости вручную проходить и настраивать заглушки для этого объекта во время теста. Это просто полезная утилита для упрощения написания тестов.

Что касается того, что/где насмехаться, все, что является внешним по отношению к модулю, подвергается издевательствам. Все, что вы хотите проверить, это текущий код модуля, а не код для некоторого модуля, который вызывается модулем под тестом.

Быстрый пример - это код, который использует модуль simplejson.

import simplejson 

def my_fn(args): 
    return simplejson.dumps({'args': args}) 

Все, что вы хотите проверить, что функция my_fn делает правильный вызов simplejson.dumps(), так что вы издеваться simplejson. Вам все равно, если объект, переданный simplejson, правильно преобразован в json как тестирование, которое входит в объем модуля simplejson (у которого есть собственный набор тестов, которые вы можете запустить, если вы так склонны).

import working_code 
import mock 

@mock.patch('working_code.simplejson') 
def test_my_fn(mock_simplejson): 
    working_code.my_fn('test-args') 
    mock_simplejson.dumps.assert_called_with({'args': 'test-args'}) 

Обратите внимание, что mock.patch - это просто хороший способ впрыскивания и удаления макетов для конкретного теста. После запуска test_my_fn рабочий_код.simplejson возвращается в состояние перед вызовом функции. Если это заблуждение, вы можете думать о тестовом примере, как:

import working_code 
import mock 

def test_my_fn(): 
    mock_simplejson = mock.Mock() 
    working_code.simplejson = mock_simplejson 
    working_code.my_fn('test-args') 
    mock_simplejson.dumps.assert_called_with({'args': 'test-args'}) 
Смежные вопросы