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.