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.
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! –