2012-09-27 6 views
4

Je dois corriger os.listdir et d'autres fonctions os pour tester ma fonction Python. Mais quand ils sont corrigés, l'instruction import échoue. Est-il possible de patcher cette fonction uniquement à l'intérieur de ce seul module, le vrai, et laisser tests.py fonctionner normalement?Patcher une fonction avec Mock uniquement pour un module?

Voici un exemple qui casse import:

import os 
from mock import patch 

# when both isdir and isfile are patched 
# the function crashes 
@patch('os.path.isdir', return_value=False) 
@patch('os.path.isfile', return_value=False) 
def test(*args): 
    import ipdb; ipdb.set_trace() 
    real_function(some_arguments) 
    pass 

test() 

Je veux real_function de voir une version patchée os.path, et des tests pour voir les fonctions normales.

here's the traceback

Répondre

4

vous pouvez utiliser patch en tant que gestionnaire de contexte, il ne s'appliquera au code dans l'instruction with:

import os 
from mock import patch 

def test(*args): 
    import ipdb; ipdb.set_trace() 
    with patch('os.path.isdir', return_value=False): 
     with patch('os.path.isfile', return_value=False): 
      real_function(some_arguments) 
    pass 

test() 
+0

C'est une bonne idée. En fait, je peux créer mon propre gestionnaire de contexte. –

0

Les travaux ci-dessous pour ce que vous avez besoin. Notez que j'imprime os.listdir avant et après le test, juste pour montrer que tout est retourné dans son état correct.

import unittest, os 
from unittest import TestLoader, TextTestRunner 

def tested_func(path): 
    return os.listdir(path * 2) 

class Example(unittest.TestCase): 

    def setUp(self): 
     self._listdir = os.listdir 
     os.listdir = lambda p: ['a', 'b', 'a', 'b'] 

    def test_tested_func(self): 
     self.assertEqual(tested_func('some_path'), ['a', 'b', 'a', 'b']) 

    def tearDown(self): 
     os.listdir = self._listdir 

print os.listdir 
TextTestRunner().run(TestLoader().loadTestsFromTestCase(Example)) 
print os.listdir 
+0

ce que vous proposez est un analogue simple module maquette, et il n'a pas résoudre le problème principal: os.listdir est également corrigé dans un autre code, et l'importation échoue. –

0

Vous pouvez utiliser un correcteur comme décorateur sur les méthodes de test ou les classes de test. Cela rend le code très propre. Notez que l'objet corrigé est transmis à la méthode de test. Vous pouvez faire la même chose au niveau de la classe de test et l'objet fantaisie sera passé dans chaque méthode de test. Il n'est pas nécessaire d'utiliser setUp ou tearDown dans ce cas car tout est géré automatiquement. Notez également que vous vous moquez de la fonction que vous voulez patcher dans le module que vous voulez réellement tester.

+0

Vous avez manqué le point: patcher les fonctions du système de fichiers os bloque les importations à partir du code corrigé. –

+0

Pourriez-vous poster un peu plus de code, un exemple de rupture? Parce que je ne sais pas comment cela ne fonctionnerait pas à partir de l'exemple que vous avez donné. J'adorerais essayer de trouver le problème. – aychedee

+0

Et le retraçage serait intéressant – aychedee

Questions connexes