[Python-es] pregunta de nova sobre unittest

Jose Caballero jcaballero.hep en gmail.com
Jue Mayo 12 16:40:54 EDT 2016


Hola,

por fin me he decidido a aprender algo sobre unittest.
Sip!, ahora. O sea que me podeis preguntar como demonios he estado
programando hasta ahora sin unit tests. Pues de aquella manera...

Imagino que me surgiran muchas preguntas. Al menos hasta que encuentre
un buen libro (no he tenido demasiada suerte hasta la fecha con esto)
y realmente comprenda lo que estoy haciendo.

La primera pregunta que tengo es de puro novato. Pido disculpas por
adelantado por ello.



Imaginemos que tengo una clase tal que

    $ cat /usr/lib/python2.6/site-packages/mypackage/mymodule.py

    class myclass:

        def f(self, ....):
            # codigo aqui
            x = self.g()
            # codigo aqui

        def g(self, ...)
            # codigo aqui

Y quiero hacer una unittest para validad metodo f( ), pero sin llamar a g( )

He estado leyendo sobre Mocking y Patching, pero por lo que he
entendido, sirven para "falsear" otras clases que se usan en el
codigo. Pero no veo como usar la misma estrategia para falsear la
propia clase que se esta verificando.

He intentado algo de este estilo:


    class Test(unittest.TestCase):

        @patch('mypackage.mymodule.myclass')
        def test_f(self, mock_requests):
            mock_requests.g.return_value = None
            obj = myclass()
            obj.f()



con la esperanza de que no se llamaria realmente al codigo g(), pero
parece que no funciona y el metodo g() sigue siendo invocado.

Imagino que una forma naive seria hacer algo tipo:


        class mytestingclass(myclass):
            def g(self...): return None


y pasar los unittest sobre la nueva clase mytestingclass.
?Pero no es algo rupestre?

Si alguien tiene un link a alguna web con ejemplos de como hacer
Mock/Patch de la propia clase, falseando las llamadas a otros metodos
desde aquel metodo que se esta validando, estare mas que agradecido.



Un saludo,
Jose
(p.s. perdon por la ausencia de tildes)


Más información sobre la lista de distribución Python-es