Python mock patch una función dentro de otra función


def f1():
    return 10, True

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

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

Editado: ¿Hay algo malo 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))
Author: Nam Ngo, 2012-04-23

2 answers

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 es el mismo que la 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

 14
Author: Vasiliy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-29 03:34:03

Asumiendo que estás usando este libario falso:

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.

 18
Author: Mariusz Jamro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-23 09:10:03