2017-12-30 22 views
0

Ich habe ein Programm, wie:Python mock startet ganzes Programm statt Eingabe auf bestimmte Methode der Substitution

Modul „Main“:

import SymbolCalculator as sc 


# Defining constants: 
TEXT_INTRO = sc.TEXT_INTRO 
TEXT_INVITE = "Please print any sentence below:\n" 
sentence = "" 
# Printing introduction to the program: 
print TEXT_INTRO 

def getting_result(): 
    # Getting input string from console 
    sentence = sc.get_input_from_prompt(TEXT_INVITE) 
    # Forming result list via methods defined in SymbolCalculator module 
    return sc.characters_calculator(sentence) 
result_list = getting_result() 
# Computing summary via method defined in SymbolCalculator module 
sc.printing_summary(sentence, result_list) 
# Printing tuples with characters and their occurrences raw-by-raw 
sc.printing_list(result_list) 
raw_input("Please press any button to quit the program.") 
print 'Bye!!!' 

Und ich versuche, einen einfachen Unit-Test mit erstellen verspott raw_input (aktualisiert):

from unittest import TestCase, main 
from mock import patch 
from Ex_41_42_SymbolCalculatorMain import getting_result 


class Ex_4a1_SymbolCalculatorUnitTestWMock(TestCase): 
    #@patch ('Ex_41_42_SymbolCalculator.get_input_from_prompt', return_value = 'aabc') 
    def test_valid_input(self): 
     with patch('__builtin__.raw_input', return_value = 'aaabbc') as _raw_input: 
      self.assertEqual(getting_result(), [('a', 3), ('b', 2), ('c', 1)]) 
      _raw_input.assert_called_once_with('Please print any sentence below:\n') 

    @patch ('Ex_41_42_SymbolCalculator.get_input_from_prompt', return_value = '') 
    def test_empty_input(self, mock): 
     self.assertEqual(getting_result(), []) 

if __name__ == "__main__": 
    main() 

Neben habe ich versucht, sich über Dekoration der getesteten Methode zu gehen, wie:

... 
@patch ('Ex_41_42_SymbolCalculator.get_input_from_prompt', return_value = 'aabc') 
... 

Mein Problem ist, dass, wenn ich den Test starte, alle "Main" -Modul zum Zeitpunkt der getting_result Methode aufrufen. So fängt es gleich am Anfang an, fordert mich auf, über Eingabeaufforderung eine Eingabe zu machen usw. Wie nicht der Test, läuft aber das normale Programm.

Während ich erwarte, dass nur getting_result -Methode aufgerufen wird mit return_value bereitgestellt wird.

Bitte beraten.

Antwort

1

Wenn Sie ein Modul importieren, wird der gesamte Code im Modul ausgeführt. Es spielt keine Rolle, dass Sie from Ex_41_42_SymbolCalculatorMain import getting_result statt import Ex_41_42_SymbolCalculatorMain verwendet haben; Sie importieren das Modul noch. Es gibt keine Möglichkeit, nur eine Funktion zu erhalten, ohne den Rest des Codes im Modul auszuführen. Statt

, sollten Sie diesen Code in eine Funktion setzen, und dann rufen Sie innerhalb einer if __name__ == "__main__" Block, wie folgt aus:

def getting_result(): 
    # Getting input string from console 
    sentence = sc.get_input_from_prompt(TEXT_INVITE) 
    # Forming result list via methods defined in SymbolCalculator module 
    return sc.characters_calculator(sentence) 

def do_stuff(): 
    print TEXT_INTRO 
    result_list = getting_result() 
    # Computing summary via method defined in SymbolCalculator module 
    sc.printing_summary(sentence, result_list) 
    # Printing tuples with characters and their occurrences raw-by-raw 
    sc.printing_list(result_list) 
    raw_input("Please press any button to quit the program.") 
    print 'Bye!!!' 

if __name__ == "__main__": 
    do_stuff() 

Dann wird do_stuff() nur ausgeführt werden, wenn Sie direkt die Datei ausführen, nicht, wenn Sie importieren es. Dies ermöglicht es Ihnen, das Modul zu importieren, ohne das Zeug in do_stuff auszuführen. Sie können mehr über das __main__ Geschäft erfahren, indem Sie diese Site nach Zillionen von Fragen darüber durchsuchen (z. B. this one).

+0

Danke @BrenBarn! Jetzt ist alles klar. Wrapped "Main" -Modul wie Sie empfohlen und leicht Unit-Test von sich aus verbessert - es gab auch einen Fehler beim Aufruf "Getting_result" innerhalb assertEqual, Klammern wurden verloren. + versuchte @ Patch-Notation. Aktualisierter Komponententest, der im Fragenhauptteil gepostet wurde. Gelöst! –