Pour compléter la réponse de Silfheed, qui était utile, j'ai dû patcher plusieurs méthodes de l'objet en question. J'ai trouvé plus élégant de le faire de cette façon :
Étant donné la fonction suivante à tester, située dans module.a_function.to_test.py
:
from some_other.module import SomeOtherClass
def add_results():
my_object = SomeOtherClass('some_contextual_parameters')
result_a = my_object.method_a()
result_b = my_object.method_b()
return result_a + result_b
Pour tester cette fonction (ou méthode de classe, peu importe), on peut patcher plusieurs méthodes de la classe SomeOtherClass
en utilisant patch.object()
en combinaison avec sys.modules
:
@patch.object(sys.modules['module.a_function.to_test'], 'SomeOtherClass')
def test__should_add_results(self, mocked_other_class):
mocked_other_class().method_a.return_value = 4
mocked_other_class().method_b.return_value = 7
self.assertEqual(add_results(), 11)
Cela fonctionne quel que soit le nombre de méthodes de SomeOtherClass
que vous devez patcher, avec des résultats indépendants.
De plus, en utilisant la même méthode Parcheando, une instance réelle de SomeOtherClass
peut être retourné si nécessaire :
@patch.object(sys.modules['module.a_function.to_test'], 'SomeOtherClass')
def test__should_add_results(self, mocked_other_class):
other_class_instance = SomeOtherClass('some_controlled_parameters')
mocked_other_class.return_value = other_class_instance
...