2017-10-16 14 views
1

Je viens de trouver une bibliothèque fictive dans Python2.7 et voudrais désintéresser ma fonction. Quel que soit le tutoriel que j'ai lu, il concerne toujours les cours. Je ne peux pas me moquer de la fonction pour travailler. Le projet est structuré de la façon dont j'ai quelques fonctions d'aide à utiliser dans une fonction de collecte et d'analyse des données de la base de données. Je veux simuler la fonction de base de données et la fonction de requête. Pour le cas simple, il ressemble à ceci:sortie de la fonction fictive unittest

import unittest 
import mock 

def queryFnc(arg=0): 
    # imitate returned result from a query 
    if arg == 0: 
     return "queryFunc 0" 
    else: return "queryFunc 1" 

def parsingFunc(): 
    # function will parse result returned from a query 
    myString = queryFnc().upper() 
    return myString 

class Test(unittest.TestCase): 
    def test_queryFunc0(self): 
     self.assertEquals("queryFunc 0", queryFnc(arg=0)) 
    def test_queryFunc1(self): 
     self.assertEquals("queryFunc 1", queryFnc(arg=1)) 
    @mock.patch('.queryFnc', return_value='queryMock') 
    def test_queryMock(self, queryFnc): 
     self.assertEquals('queryMock', queryFnc()) 

    def test_parsingFunc(self): 
     self.assertEquals('QUERYFUNC 0', parsingFunc()) 
    @mock.patch('.queryFnc', return_value='queryMock') 
    def test_parsingFuncMock(self): 
     self.assertEquals('QUERYMOCK', parsingFunc()) 

if __name__ == "__main__": 
    unittest.main() 

Je me attendais à ce que le @mock.patch remplacera la fonction de l'appel, mais je peux le faire fonctionner. J'ai ces erreurs:

====================================================================== 
ERROR: test_queryMock (__main__.Test) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "\site-packages\mock\mock.py", line 1297, in patched 
    arg = patching.__enter__() 
    File "\site-packages\mock\mock.py", line 1353, in __enter__ 
    self.target = self.getter() 
    File "\site-packages\mock\mock.py", line 1523, in <lambda> 
    getter = lambda: _importer(target) 
    File "\site-packages\mock\mock.py", line 1206, in _importer 
    thing = __import__(import_path) 
ValueError: Empty module name 

Y at-il un moyen d'utiliser un autre résultat de fonction dans une autre fonction? Je suis contraint d'utiliser Python2.7

Répondre

1

The basic principle is that you patch where an object is looked up. Vous avez quelques possibilités en utilisant mock affectation, with gestionnaire de concours et @mock.patch décorateur. J'ai joint un code pour quelques cas avec l'instruction d'impression incluse vous montrant quand la fonction recherche l'original et où pour l'objet simulacre.

# CASE 1 taking query as mock inside test_ function 
def test_queryMock1(self): 
    queryFnc = mock.Mock(return_value = 'case1') 
    print("Case 1 inside test_ after mock assignemnt", queryFnc(), queryFnc(1)) 
    self.assertEquals('case1', queryFnc(1)) 
print("Case1 after outside", queryFnc(), queryFnc(1)) 

# CASE 2 contest management with 
def test_queryMock2(self): 
    print("Case 2 inside test", queryFnc(), queryFnc(1)) 
    with mock.patch('__main__.queryFnc', return_value='case2'): 
     print("Case 2 after with", queryFnc(), queryFnc(1)) 
     self.assertEquals('case2', queryFnc()) 
print("Case 2 outside", queryFnc(), queryFnc(1)) 

# CASE 3 patching 
@mock.patch('__main__.queryFnc', return_value='case3') 
def test_queryMock3(self, *args): 
    self.assertEquals('case3',queryFnc()) 

# CASE 4 using contest management for nested function 
def test_InsideWith(self): 
    print("Case 4 inside test_", queryFnc(), queryFnc(1)) 
    #with mock.patch('__main__.queryFnc', side_effect=mockText) as mock_function_obj: 
    with mock.patch('__main__.queryFnc', return_value='case4'): 
     print("Case 4 inside with", queryFnc(), queryFnc(1)) 
     self.assertEquals('CASE4', parsingFunc()) 
print("Case 4 outside", queryFnc(), queryFnc(1)) 

# CASE 5 using patch decorator 
@mock.patch('__main__.queryFnc', return_value='case5') 
def test_Patch(self, *args): 
    print("Case 5 inside test_ after patch", queryFnc(), queryFnc(1)) 
    self.assertEquals('CASE5', parsingFunc()) 
    print("Case 5 inside test_, assert", queryFnc(), queryFnc(1)) 
print("Case 5 outside", queryFnc(), queryFnc(1)) 

S'il vous plaît noter que dans le patch du module est spécifié comme __main__ où vous voulez patcher. Si vous expérimentez avec le nom du module, vous pouvez voir comment cela modifie le comportement du patch.