unittest - python 2.7 mock
Python devuelve el objeto MagicMock en lugar de return_value (1)
Tengo un archivo de python a.py que contiene dos clases A y B
class A(object):
def method_a(self):
return "Class A method a"
class B(object):
def method_b(self):
a = A()
print a.method_a()
Me gustaría method_b en clase B method_b A Aquí está el contenido del archivo testa.py para este propósito:
import unittest
import mock
import a
class TestB(unittest.TestCase):
@mock.patch(''a.A'')
def test_method_b(self, mock_a):
mock_a.method_a.return_value = ''Mocked A''
b = a.B()
b.method_b()
if __name__ == ''__main__'':
unittest.main()
Espero obtener Mocked A en la salida. Pero lo que obtengo es:
<MagicMock name=''A().method_a()'' id=''4326621392''>
¿Dónde estoy haciendo mal?
Cuando @mock.patch(''a.A'') , está reemplazando la clase A en el código bajo prueba con mock_a .
En B.method_b a continuación, establece a = A() , que ahora es a = mock_a() , es decir, a es el valor de mock_a de mock_a . Como no has especificado este valor, es un MagicMock normal; esto tampoco está configurado, así que obtienes la respuesta predeterminada (otro MagicMock ) cuando llamas a los métodos.
En su lugar, desea configurar el valor de mock_a de mock_a para tener el método apropiado, que puede hacer como:
mock_a().method_a.return_value = ''Mocked A''
# ^ note parentheses
o, quizás más explícitamente:
mock_a.return_value.method_a.return_value = ''Mocked A''
Su código habría funcionado en el caso de a = A (asignando la clase, no creando una instancia), ya que entonces a.method_a() habría activado su método simulado.