Вот ответ, который работает в python 2.7.10 и 3.6.1 в Windows
import sys
if sys.version_info[0] < 3:
from mock import patch
else:
from unittest.mock import patch
def foo():
return goo()
def goo():
return 3
class CaptureValues(object):
def __init__(self, func):
self.func = func
self.return_values = []
def __call__(self, *args, **kwargs):
answer = self.func(*args, **kwargs)
self.return_values.append(answer)
return answer
def test():
with patch('__main__.goo', CaptureValues(goo)) as goo_mock:
x = foo()
x = foo()
print(goo_mock.return_values)
assert goo_mock.return_values == [3, 3]
if __name__ == '__main__':
test()
return_value
используется, когда вы хотите, чтобы ваша функция возвращала какое-то произвольное значение, чтобы вы могли проверить другие детали. Вот goo
, который требует много времени для расчета. Я уже тестировал goo
где-то еще, и я действительно тестирую внутренние компоненты foo
, и я не хочу ждать 5 секунд, чтобы вычислить истинный ответ, который возвращает goo
. (чтобы увидеть разницу, раскомментируйте slow_test
и посмотрите захватывающий отсчет)
import time
from unittest.mock import patch
def foo(x):
return goo(x)
def goo(x):
for sec in range(x, 0, -1):
time.sleep(1)
print(sec)
return x**2
def slow_test():
x = foo(5)
assert x == 25
def test():
with patch('__main__.goo') as goo_mock:
goo_mock.return_value = 25
x = foo('who cares')
assert x == 25
if __name__ == '__main__':
test()
# slow_test()
Как правило, вы хотите использовать поддельные выражения для создания ложного ответа от вашего помощника, goo
. Это делается для того, чтобы убедиться, что foo
работает должным образом с конкретными ответами от goo
и / или чтобы проверить, что при преобразовании данных в goo
вы передаете правильные данные.
- тест
goo
- тест
foo
:
- с
mock_goo.assert_called_with()
убедитесь, что вы передали goo
правильные значения
- установить
mock_goo.return_value
для проверки foo
с различными значениями, возвращаемыми из goo