Это работает:
def foo():
raise ValueError, "Don't call me during testing!"
def bar():
"""
Returns twice the value of foo()
>>> from minimock import mock
>>> mock('foo',returns=5)
>>> bar.func_globals['foo'] = foo
>>> bar()
Called foo()
10
"""
return foo() * 2
if __name__ == "__main__":
import doctest
doctest.testmod()
Кажется, что foo in bar уже привязан к исходной функции к тому времени, когда происходит насмешка.
Это происходит потому, что при запуске doctests модуль doctest запускается в контексте копии глобального пространства имен модуля , но глобалы bar
остаются оригинальными самостоятельно. Таким образом, функция mock
изменяет foo
, который находится в скопированном пространстве имен, но bar
все еще смотрит на оригинал.
Я не знаю, есть ли лучший способ сделать это.
РЕДАКТИРОВАТЬ 2 : Я забрал его MiniMock был специально разработан для использования в докутах. Я подозреваю, что вы нашли ошибку.
РЕДАКТИРОВАТЬ : Думаю, рекомендуемый способ сделать это - настроить насмешку перед началом испытаний, например:
def foo():
raise ValueError, "Don't call me during testing!"
def bar():
"""
Returns twice the value of foo()
>>> bar()
10
"""
return foo() * 2
if __name__ == "__main__":
from minimock import mock
mock('foo',returns=5)
import doctest
doctest.testmod()
Таким образом, сообщение «Called foo ()» также отсутствует в doctest.