114 votes

Python retourne un objet MagicMock au lieu de return_value

J'ai un fichier python a.py qui contient deux classes A et 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()

Je voudrais unittest method_b dans la classe B par se moquer A. Voici le contenu du fichier testa.py à cet effet:

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()

- Je espérer Mocked A à la sortie. Mais ce que je reçois est:

<MagicMock name='A().method_a()' id='4326621392'>

Où suis-je fais de mal?

136voto

jonrsharpe Points 34770

Lorsque vous @mock.patch('a.A'), vous remplacez la classe A dans le code testé avec mock_a.

En B.method_b puis, vous définissez a = A(), ce qui est maintenant a = mock_a() - c'est-àdire a est le return_value de mock_a. Comme vous n'avez pas spécifié de cette valeur, il est un habitué MagicMock; ce n'est pas configurée de sorte que vous obtenez la réponse par défaut (encore un autre MagicMock) lors de l'appel de méthodes sur elle.

Au lieu de cela, vous voulez configurer l' return_value de mock_a d'avoir de la méthode appropriée, que vous pouvez le faire soit:

mock_a().method_a.return_value = 'Mocked A' 
    # ^ note parentheses

ou, peut-être plus explicite:

mock_a.return_value.method_a.return_value = 'Mocked A'

Votre code aurait travaillé dans les cas a = A (assigner la classe, et non la création d'une instance), comme à l'époque, a.method_a() , a déclenché votre maquette de la méthode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X