2016-12-13 11 views
0

Я использую библиотеку waiting в некоторых своих кодах, чтобы подождать, пока условие станет истинным. В качестве части библиотеки waiting.wait возвращает True, когда предикат является истинным; в противном случае он выбрасывает и исключает или ожидает навсегда в зависимости от значений таймаута и т. д.Как я могу высмеять библиотеку ожидания в Python?

Я хотел бы исправить это в своих тестах, чтобы всегда возвращать True, не попадая в цикл ожидания. Вот моя попытка:

#!/usr/bin/env python3 

from unittest.mock import Mock 
import waiting 
from waiting import wait 

def test_waiting(): 
    waiting.wait.return_value = True 
    # Below *should* wait forever because it can never be true. 
    # Want to make it return true instead. 
    return wait(lambda: False) 

if __name__ == "__main__": 
    assert(test_waiting()) 

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

Как заставить этот метод просто вернуть значение (или поднять побочный эффект) без фактического вызова кода?

ответ

1

Ваш waiting.wait.return_value = True не будет работать, потому что waiting.wait не является макетным объектом. Вы добавили только произвольный атрибут к существующей функции wait, но эта функция не будет использовать этот атрибут.

издеваться из функции wait, просто издеваться непосредственно:

from unittest import mock 

with mock.patch('__main__.wait'): 
    wait.return_value = True 

Там нет необходимости издеваться внутренностях waiting библиотеки, все, что вы хотите, чтобы это произошло в вашем коде, что любое использование wait() вызываемый немедленно возвращается.

Обратите внимание, что я выбрал модуль __main__ для исправления имени wait(), см. Where to patch в документации unittest.mock.

Ваше фактическое местоположение может отличаться, и если вы использовали import waiting везде, то вам нужно будет использовать mock.patch('waiting.wait'). В противном случае вы, как правило, применяли бы тот же модуль, который вы использовали from waiting import wait.

+0

Ну, это было глупо от меня. :) Работает отлично. Ура! – erip