2015-11-12 3 views
0

У меня есть тест ниже, используя mock на Python 2.6.Mock Confusion with Path

@patch('testme.check.RE.query') 
def test_check(query): 
    query.filter.one = MagicMock(return_value=None) 
    .... 
    assert against_experiment(cl, ei, cd) 

Внутри модуля Я хочу, чтобы проверить, у меня есть

def check_against_experiment(c, e, c): 
    re = RE.query.filter(RE.e_id == e).one() 

Два вопроса:

При осмотре re = RE.query.filter(RE.e_id == e).one(), я вижу <MagicMock name='query.filter().one()' id='62856528'>.

Почему это не возвращается None?

Другой вопрос, когда я изменяю @path('testme.check.RE.query')@path('testme.check.RE.query') к и изменить query.filter.one к query.one, я заметил, что ничего не издевались из. Почему это так?

+0

Когда вы проверили, вы проверили, что находится внутри 'return_value'? Кроме того, точно так же, как тест, положите 'return_value = 123' и также проверите' return_value'. Что касается вашего второго вопроса, все зависит от вашего относительного импорта. Я не знаю, как ваш проект настроен и как все относится друг к другу, но, вероятно, из-за этого. Кроме того, они одинаковы: '@path ('testme.check.RE.query')' to '@path ('testme.check.RE.query')' – idjaw

ответ

0

Когда вы звоните RE.query.filter(RE.e_id == e) в вашей функцию испытуемого, он возвращает новый ненастроенногоMagicMock, а затем вы вызываете one функцию, которая генерирующее что по умолчанию return_value.

Вы, вероятно, хотите, чтобы установить return_value из filter быть новая функция Mock которой one возвращает None.

0

Короткий ответ, что вы хотите сделать, это

query.filter.return_value.one.return_value = None 

атрибут По умолчанию Мок в return_value является MagickMock объект (AFAIK выделяется в качестве ленивого собственности).

IMHO старайтесь избегать таких макетных конфигураций, чтобы ваш класс/функция были более четкими и узкими, чтобы избежать просмотра объектов. Такой тест делает источник и тесты запутанными и создает сплошной забор для рефакторинга.

Для вашего второго вопроса я могу просто указать вам на Where to Patchдолжен читать документ. Из того, что вы говорите, невозможно найти основную причину, я могу поспорить, что ответ всегда находится в главе этой документации.