J'utilise la bibliothèque Mock pour tester mon application, mais je veux affirmer qu'une fonction n'a pas été appelée. Les documents simulés parlent de méthodes telles que mock.assert_called_with
et mock.assert_called_once_with
, mais je n'ai rien trouvé de similaire mock.assert_not_called
ou lié à vérifier que la simulation n'a pas été appelée .
Je pourrais aller avec quelque chose comme ce qui suit, même si cela ne semble pas cool ni pythonique:
def test_something:
# some actions
with patch('something') as my_var:
try:
# args are not important. func should never be called in this test
my_var.assert_called_with(some, args)
except AssertionError:
pass # this error being raised means it's ok
# other stuff
Des idées pour y parvenir?
Réponses:
Cela devrait fonctionner pour votre cas;
Échantillon;
la source
AttributeError: MockCallable instance has no attribute 'called'
sudo easy_install -U mock
etfrom mock import Mock
sur MacOS, ce qui précède fonctionne sans accroc. Jamais installé Django :)from mock import Mock
avec Python Mock 0.1.0 pour mes tests. Est-ce que tout cela semble problématique?module_to_test.another_module.class = mock.Mock()
, pouvez-vous confirmer que cela ne se souvient pas des appels dans différents cas de test (instances unittest.TestCase)? Je pense que le nombre d'appels ne se réinitialise pas dans ce casBien qu'il s'agisse d'une vieille question, je voudrais ajouter que la
mock
bibliothèque actuellement (backport de unittest.mock) prend en charge laassert_not_called
méthode.Mettez simplement le vôtre à niveau;
pip install mock --upgrade
la source
Vous pouvez vérifier l'
called
attribut, mais si votre assertion échoue, la prochaine chose que vous voudrez savoir est quelque chose à propos de l'appel inattendu, vous pouvez donc également faire en sorte que ces informations soient affichées dès le début. En utilisantunittest
, vous pouvez vérifier le contenu de à lacall_args_list
place:Quand il échoue, il donne un message comme celui-ci:
la source
Lorsque vous testez en utilisant la classe hérite unittest.TestCase, vous pouvez simplement utiliser des méthodes telles que:
et similaire (dans la documentation python, vous trouvez le reste).
Dans votre exemple, nous pouvons simplement affirmer si la propriété mock_method.called est False , ce qui signifie que la méthode n'a pas été appelée.
la source
Avec
python >= 3.5
vous pouvez utilisermock_object.assert_not_called()
.la source
À en juger par d'autres réponses, personne à l'exception de @ rob-kennedy n'a parlé de
call_args_list
.C'est un outil puissant pour lequel vous pouvez implémenter exactement le contraire de
MagicMock.assert_called_with()
call_args_list
est une liste d'call
objets. Chaquecall
objet représente un appel effectué sur un appelable simulé.La consommation d'un
call
objet est facile, car vous pouvez le comparer avec un tuple de longueur 2 où le premier composant est un tuple contenant tous les arguments de position de l'appel associé, tandis que le second composant est un dictionnaire des arguments de mot-clé.Ainsi, un moyen de résoudre le problème spécifique du PO est
Notez que de cette façon, au lieu de simplement vérifier si un appelable simulé a été appelé, via
MagicMock.called
, vous pouvez maintenant vérifier s'il a été appelé avec un ensemble spécifique d'arguments.C'est utile. Supposons que vous souhaitiez tester une fonction qui prend une liste et appeler une autre fonction,,
compute()
pour chacune des valeurs de la liste uniquement si elles satisfont à une condition spécifique.Vous pouvez maintenant vous moquer
compute
et tester si elle a été appelée sur une valeur mais pas sur d'autres.la source