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.