Python simula un parche de una función dentro de otra función

def f1(): return 10, True def f2(): num, stat = f1() return 2*num, stat 

¿Cómo uso la biblioteca simulada de python para parchear f1() y devolver un resultado personalizado para poder probar f2() ?

Editado: ¿Hay algún problema con mi prueba? Esto no parece estar funcionando, todas las pruebas fallaron con 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)) 

El primer ejemplo sugiere que f1 () y f2 () se definen en el mismo módulo. Por lo tanto, lo siguiente debería funcionar:

 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)) 

El parche está en la misma importación: @patch('foo.bar.f1')

Aquí hay una buena respuesta sobre el tema:

http://bhfsteve.blogspot.nl/2012/06/patching-tip-using-mocks-in-python-unit.html

Suponiendo que estás utilizando esta biblioteca falsa :

 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) 

Si su código está dividido en módulos, probablemente necesite reemplazar __main__.f1 con la ruta a su módulo / función.