¿Alguna forma de restablecer un método simulado a su estado original? – Python Mock – simulacro 1.0b1

Tengo la siguiente clase simplificada de 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 a check() y burlarse de A() dentro de check() , llama al check() completamente burlado check() de mi segunda prueba.

¿Hay alguna forma de borrar y configurar el método para que sea “normal” después de la prueba? Ya probé myClass.check.reset_mock() , pero no parece hacer nada. Mover el orden de mis pruebas tampoco hace nada.

Estoy usando simulacro 1.0b1 para python desde http://pypi.python.org/pypi/mock/

Puedes esconder la función por ti 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() 

Ejecutando este archivo da el siguiente resultado:

 First Test   Second Test   

Me encontré usando el decorador de parches mucho más que configurar y desmontar ahora. En este caso podrias 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 

Puedes usar mock.patch como decorador o administrador 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 para patch , proporcionará un simulacro que puede modificar automáticamente:

 @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.