¿Alguna forma de restablecer un método burlado a su estado original? - Python Mock-mock 1. 0b1


Tengo la siguiente clase simplificada de la que me estoy burlando:

class myClass(object):
    @staticmethod
    def A():
        #...

    def check(self):
        #code...
        value = self.A()
        #more code...

En mi primera prueba me burlo solo del método A

from django.test import TestCase
from mock import MagicMock
import myClass

class FirstTest(TestCase):

def setUp(self):
    myClass.A = MagicMock(return_value = 'CPU')

def test(self):
    #some tests 
    myClassObj = myClass()
    myClassObj.check()

Mientras que en mi segunda prueba me burlo de todo el método de verificación:

from django.test import TestCase
from mock import MagicMock
import myClass

class SecondTest(TestCase):

def setUp(self):
    myClass.check = MagicMock(return_value = someObject)

def test(self):
    #some tests 
    myClassObj = myClass()
    myClassObj.check()

Ahora mis afirmaciones de mi primera prueba fallan porque, en lugar de llamar check() y burlarse A() dentro de check(), llama al check() completamente burlado de mi segunda prueba.

¿Hay alguna manera de borrar y establecer el método para que sea 'normal' después de la prueba? He intentado myClass.check.reset_mock() ya, pero no parece hacer nada. Mover el orden de mis pruebas tampoco hace nada.

Estoy usando mock 1. 0b1 para python desde http://pypi.python.org/pypi/mock /

Author: g t, 2012-07-31

2 answers

Puedes guardar la función en uno mismo y volver a ponerla cuando hayas terminado.

import unittest

from mock import MagicMock
from MyClass import MyClass

class FirstTest(unittest.TestCase):

    def setUp(self):
        self.A = MyClass.A
        MyClass.A = MagicMock(name='mocked A', return_value='CPU')


    def tearDown(self):
        MyClass.A = self.A

    def test_mocked_static_method(self):
        print 'First Test'
        print MyClass.check
        print MyClass.A


class SecondTest(unittest.TestCase):

    def setUp(self):
        MyClass.check = MagicMock(name='mocked check', return_value=object)

    def test_check_mocked_check_method(self):
        print 'Second Test'
        print MyClass.check
        print MyClass.A


if __name__ == '__main__':
    unittest.main()

Al ejecutar este archivo se obtiene la siguiente salida:

First Test
<unbound method MyClass.check> 
<MagicMock name='mocked A' id='141382732'>
Second Test
<MagicMock name='mocked check' id='141382860'>
<unbound method MyClass.A>

Me encontré usando el decorador de parches mucho más que Configurar y desmontar ahora. En este caso se podría hacer

from mock import patch

@patch('MyClass.A')
def test_mocked_static_method(self, mocked_A)
    mocked_A.return_value = 'CPU'
    # This mock will expire when the test method is finished
 9
Author: aychedee,
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-08-03 07:59:55

Puedes usar mock.patch como decorador o gestor de contexto:

from mock import patch, MagicMock

@patch('myClass.A', MagicMock(return_value='CPU'))
def test(self):
    pass

O:

def test(self):
    with patch('myClass.A', MagicMock(return_value='CPU')):
        pass

Si no proporciona un objeto simulado a patch entonces proporcionará un mock autospecced que puede modificar:

@patch('myClass.A')
def test(self, mock_A):
    mock_A.return_value = 'CPU'
    pass

O:

def test(self):
    with patch('myClass.A') as mock_A:
        mock_A.return_value = 'CPU'
        pass

En todos los casos, el valor original se restaurará cuando finalice la función de prueba decorada o el administrador de contexto.

 31
Author: ecatmur,
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-08-03 08:45:45