2015-03-23 1 views
0

J'utilise la bibliothèque mock python (python 2.7, mock == 1.0.1) et lorsque je moque certaines parties du code que je suis en train de tester, c'est en avalant des exceptions pour une raison quelconque.Python mock avale des exceptions

Voici un exemple:

#test.py 
from django import test 
from something import main_func 
class TestCase(test.TestCase): 
    @mock.patch('something.somewhere') 
    def test_something(mock_somewhere): 
    main_func() 


#something.py 
def somewhere(param): 
    print param 

def main_func(): 
    somewhere(None.missing_something) 

Alors AttributeError devrait être soulevée à droite? Ce test passe sur ma machine, en réalité le code est plus compliqué, un modèle Django est supposé être sauvegardé et existant. Le test échoue car le modèle n'existe pas.

Si j'insère un import ipdb; ipdb.set_trace() juste avant somewhere(None.missing_method) alors je peux voir que AttributeException est élevé mais il n'apparaît pas dans le test.

Des idées?

+0

par curiosité ... fait votre fichier de test unitaire a une ligne 'if __name__ == '__main__': unittest.main()' à la fin? – mgilson

+0

Hirondelles à jeun? – jonrsharpe

+0

Veuillez corriger votre code qui ne peut pas être exécuté: il y a trop d'erreur pour comprendre où est la cause. J'ai corrigé le parent de la classe de test '(unittest.TestCase)' et les arguments de test par 'self, mock_somewhere' et il déclenche une exception comme prévu. Quoi qu'il en soit, si vous voyez l'exception dans le débogueur mais que le test ne l'attrape pas, je suppose que vous avez plus de threads et que l'exception n'est pas dans votre thread de test mais dans un autre. –

Répondre

0

Je pense que vous devez utiliser un exemple « spec » autospec=True

http://www.voidspace.org.uk/python/mock/patch.html

Ce sera alors faire en sorte que la maquette générée soulèvera des erreurs d'attributs si vous essayez d'accéder à un attribut qui n'existait pas sur l'objet original, sinon la maquette va simplement retourner une nouvelle maquette pour tout accès attr

par exemple

from something import main_func 

class TestCase(test.TestCase): 
    @mock.patch('something.somewhere', autospec=True) 
    def test_something(mock_somewhere): 
    main_func() 
+0

'autospec = True' est même un bon conseil mais il ne peut pas être lié à la question où il tape' None.missing_something' et 'None' n'est pas une instance corrigée. –

+0

vrai, je suppose que le code en question n'était pas un exemple réel complet et le problème sous-jacent était quelque chose comme ça – Anentropic