unittest mock python python-unittest magicmock

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.