2015-12-18 3 views
0

Editer: Cette question se réfère à python 3.5python quelque chose comme assertFunctionNotCalled?

Dans les tests unitaires python, existe-t-il un moyen d'affirmer qu'un bloc de code donné n'est pas appelé?

J'ai une fonction que je suis en train de tester qui peut suivre deux branches: une branche plus rapide et plus fiable si l'utilisateur s'est connecté auparavant, ou une branche plus lente et moins fiable si c'est sa première visite. Fondamentalement, la première fois qu'un utilisateur se connecte, le programme doit demander des informations à son sujet depuis un serveur séparé, ce qui peut être lent (et, parfois, vers le bas). Une fois qu'il a l'information, cependant, il met en cache localement et devrait simplement utiliser le cache local pour les données sur les connexions suivantes. Le résultat final de la fonction est le même dans tous les cas, donc je n'ai aucun moyen de savoir quelle branche de code il a fallu pour obtenir l'information en regardant simplement la sortie de la fonction. Donc, idéalement, je voudrais être en mesure de faire un assertFunctionNotCalled efficace pour tester qu'il tire du cache local lors de la deuxième (et ultérieure) tentative de connexion. Comment devrais-je le mieux tester cela?

+0

vous moquez-vous sur le serveur séparé pour ces tests? Qu'avez-vous essayé jusqu'à présent? – jonrsharpe

+0

@jonrsharpe: non, je fais la demande actuelle. Comme il s'agit juste d'un SELECT, ça ne fait pas mal de l'exécuter plusieurs fois. – ibrewster

+0

Cela ne nuira peut-être à rien, mais rendra plus difficile le test (et indiquera de quel côté se sont produits les changements de bris). Peut-être que cela devrait être un test unitaire contre un simulacre, et les tests qui appellent réellement devraient être des tests d'intégration séparés. – jonrsharpe

Répondre

2

Utilisez le bool appelé comme ceci:

from mock import patch 
with patch('something') as mock_something: 
    self.assertFalse(mock_something.called)