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
en classe en me B
moquant 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 m'attends à entrer Mocked A
dans la sortie. Mais ce que j'obtiens c'est:
<MagicMock name='A().method_a()' id='4326621392'>
Où vais-je mal?
python
python-unittest
magicmock
Mehdi Jafarnia Jahromi
la source
la source
A()
renvoie lereturn_value
frommock_A
(un standardMagicMock
, car vous n'avez rien spécifié d'autre), qui n'est pas une instance de la classeA
. Vous devez définir celareturn_value
comme quelque chose qui a un fichier définimethod_a
.mock_a
qui devrait avoir la méthode, pasmock_a
elle-même.mock_a().method_a.return_value = 'Mocked A'
et amock_a.return_value.method_a.return_value = 'Mocked A'
travaillé. Merci beaucoup pour vos commentaires. Pourriez-vous s'il vous plaît aller de l'avant et le mettre comme réponse?Réponses:
Lorsque vous
@mock.patch('a.A')
, vous remplacez la classeA
dans le code testé parmock_a
.En
B.method_b
vous définissez alorsa = A()
, qui est maintenanta = mock_a()
- c'est à direa
est lereturn_value
demock_a
. Comme vous n'avez pas spécifié cette valeur, c'est une valeur régulièreMagicMock
; cela n'est pas configuré non plus, vous obtenez donc la réponse par défaut (encore une autreMagicMock
) lorsque vous appelez des méthodes dessus., Vous voulez plutôt que de configurer le
return_value
demock_a
avoir la méthode appropriée, que vous pouvez faire comme soit:mock_a().method_a.return_value = 'Mocked A' # ^ note parentheses
ou, peut-être plus explicitement:
mock_a.return_value.method_a.return_value = 'Mocked A'
Votre code aurait fonctionné dans le cas
a = A
(attribuer la classe, ne pas créer d'instance), comme alorsa.method_a()
aurait déclenché votre méthode fictive.la source
mock_data.configure_mock(columns='my_column')
résoudre. Merci pour la réponse. (réf: bradmontgomery.net/blog/how-world-do-you-mock-name-attribute )