2017-10-16 11 views
0

La seule chose qui peut être utilisée est le faux.Farceur profonde avec remplacement de la méthode

#tested.py 
from somemodule import somelogger 

class MyClass(object): 
    def __init__(self): 
     self.logger = somelogger() 

    def do_smth(self): 
     self.logger.log(message) 

Importantdétail: Module somemodule n'existe pas, donc les solutions habituelles comme @patch ne pas suite.

J'ai besoin de se moquer somemodulesomelogger's méthode log pour qu'il effectue impression simple:

#tests.py 
from tested import MyClass 


def test_logging(): 
    obj = MyClass() 
    obj.do_smth('some_message') 

Dans la console:

some_message 

Répondre

0

Je pense que la façon de le faire serait d'utiliser la méthode unittest.mock.patch comme décrit ici: https://docs.python.org/3/library/unittest.mock.html#unittest.mock.patch

Dans votre fichier tests.py, créez une méthode de journalisation simulée d faire l'impression.

# tests.py 
from tested import MyClass 
from unittest.mock import patch 

def mocked_log(log_msg): 
    print(log_msg) 

@patch('tested.somelogger.log') 
def test_logging(mock_logger) 
    mock_logger.return_value = mocked_log 

    obj = MyClass() 
    obj.do_smth('some message') 
+0

Avez-vous essayé cet exemple? Quelle version de python? – sann05

+0

Ceci est pour python 3.6. J'ai fait des simulations similaires dans des systèmes plus complexes et tout a bien fonctionné. Si vous utilisez 2.7.x, alors mock doit être installé en premier et vous devrez importer mock au lieu de unittest.mock. – suripoori

+0

Désolé j'ai manqué un détail crucial: module somemodule ** n'est pas ** ** suppose ** ** à ** ** existe **. Donc, quand nous essayons de l'importer, nous obtenons toujours ImportError: Aucun module nommé ** somemodule ** – sann05