unittest mock python mocking python-mock

unittest - ¿Alguna manera de restablecer un método simulado a su estado original?-Python Mock-simulacro 1.0b1



python 2.7 mock (2)

Puede esconder la función en sí mismo y volver a colocarla cuando haya 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()

La ejecución de este archivo proporciona el siguiente resultado:

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 setUp y tearDown ahora. En este caso, podrías 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

Tengo la siguiente clase simplificada de burla:

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() totalmente burlado check() de mi segunda prueba.

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

Estoy usando el simulador 1.0b1 para Python desde http://pypi.python.org/pypi/mock/


Puede 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 entonces proporcionará un simulacro autoespecificado 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.