2017-10-16 6 views
1

Ich habe gerade eine Pseudo-Bibliothek in Python2.7 gefunden und möchte meine Funktion zu vereinen. Welches Tutorial ich auch lese, es geht immer um Klassen. Ich kann nicht spotten Funktion zu arbeiten. Das Projekt ist so strukturiert, dass ich einige hilfreiche Funktionen habe, die in einer Funktion zum Sammeln und Analysieren von Daten aus der Datenbank verwendet werden können. Ich möchte Datenbankfunktion und Abfragefunktion vortäuschen. Für den einfachen Fall sieht es so wie:Unitest Mock-Funktion Ausgabe

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() 

ich erwartet, dass die @mock.patch die Funktion auf den Anruf ersetzen, aber ich kann es bekommen zu arbeiten. Ich habe diesen Fehler:

====================================================================== 
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 

ist es eine Möglichkeit, unterschiedliches Funktionsergebnis in einer anderen Funktion zu benutzen? Ich bin gezwungen, Python2.7

Antwort

1

The basic principle is that you patch where an object is looked up zu verwenden. Sie haben ein paar Möglichkeiten mit mock Zuweisung, with Contest Manager und @mock.patch Dekorateur. Ich fügte einen Code für einige Fälle mit der eingeschlossenen Druckanweisung an, die dir zeigt, wenn die Funktion nach Vorlage sucht und wo für Scheinobjekt.

# 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)) 

Bitte beachten Sie, dass in Patch das Modul als __main__ angegeben wird, wo Sie flicken wollen. Wenn Sie mit dem Modulnamen experimentieren, können Sie sehen, wie sich das Patch-Verhalten ändert.