Python mock исправляет функцию в рамках другой функции
def f1():
return 10, True
def f2():
num, stat = f1()
return 2*num, stat
Как использовать библиотеку python mock для исправления f1()
и вернуть пользовательский результат, чтобы я мог протестировать f2()
?
Отредактировано:
Что-то не так с моим тестом? Кажется, что это не работает, все тесты не удались с AssertionError
from foo.bar import f2
from mock import patch
class MyTest(TestCase):
def test_f2_1(self):
with patch('project.module.f1') as some_func:
some_func.return_value = (20, False)
num, stat = f2()
self.assertEqual((num, stat), (40, False))
@patch('project.module.f1')
def test_f2_2(self, some_func):
some_func.return_value = (20, False)
num, stat = f2()
self.assertEqual((num, stat), (40, False))
Ответы
Ответ 1
В первом примере предполагается, что f1() и f2() определены в том же модуле.
Следовательно, должно работать следующее:
from foo.bar import f2
from mock import patch
class MyTest(TestCase):
@patch('foo.bar.f1')
def test_f2_2(self, some_func):
some_func.return_value = (20, False)
num, stat = f2()
self.assertEqual((num, stat), (40, False))
Патч находится на том же самом, что и импорт: @patch('foo.bar.f1')
Вот хороший ответ на этот вопрос:
http://bhfsteve.blogspot.nl/2012/06/patching-tip-using-mocks-in-python-unit.html
Ответ 2
Предполагая, что вы используете эту mock libary:
def f1():
return 10, True
def f2():
num, stat = f1()
return 2*num, stat
import mock
print f2() # Unchanged f1 -> prints (20, True)
with mock.patch('__main__.f1') as MockClass: # replace f1 with MockClass
MockClass.return_value = (30, True) # Change the return value
print f2() # f2 with changed f1 -> prints (60, True)
Если ваш код разделен на модули, вам, вероятно, потребуется заменить __main__.f1
на путь к вашему модулю/функции.