Аз съм доста нов в цялото това „нещо с програмирането“, но на 34 години си помислих, че бих искал да науча основите. За съжаление не познавам програмисти на Python. Уча програмиране поради личен интерес (и все повече и повече за забавление), но моето "социално местообитание" не е "където програмистите бродят" ;) . Почти приключих със Zed Shaws „Научете Python по трудния начин“ и за първи път не мога да намеря решение на проблем. През последните два дни дори не попаднах на полезни съвети къде да търся, когато многократно перифразирах (и потърсих) въпроса си. Така че stackoverflow изглежда е правилното място. Между другото: Липсва ми и правилният речник доста често, така че, моля, не се колебайте да ме поправите :) . Това може да е една от причините да не мога да намеря отговор. Използвам Python 2.7 и nosetests.
Доколко реших проблема (мисля) в стъпките, които го реших:
Функция 1:
def inp_1():
s = raw_input(">>> ")
return s
Всички тестове импортират следното, за да могат да правят нещата по-долу:
from nose.tools import *
import sys
from StringIO import StringIO
from mock import *
import __builtin__
# and of course the module with the functions
Ето теста за inp_1:
import __builtin__
from mock import *
def test_inp_1():
__builtin__.raw_input = Mock(return_value="foo")
assert_equal(inp_1(), 'foo')
Тази функция/тест е ок.
Доста подобна е следната функция 2:
def inp_2():
s = raw_input(">>> ")
if s == '1':
return s
else:
print "wrong"
Тест:
def test_inp_2():
__builtin__.raw_input = Mock(return_value="1")
assert_equal(inp_1(), '1')
__builtin__.raw_input = Mock(return_value="foo")
out = StringIO()
sys.stdout = out
inp_1()
output = out.getvalue().strip()
assert_equal(output, 'wrong')
Тази функция/тест също е ок.
Моля, не предполагайте, че наистина знам какво се случва „зад кулисите“, когато използвам всички неща по-горе. Имам някои неспециализирани обяснения как всичко това функционира и защо получавам резултатите, които искам, но също така имам чувството, че тези обяснения може да не са напълно верни. Няма да е първият път, когато мисля нещо. работите се оказват различни, след като научих повече. Особено всичко с "__" ме обърква и ме е страх да го използвам, тъй като наистина не разбирам какво се случва. Както и да е, сега аз "просто" искам да добавя while-цикъл, за да поискам въвеждане, докато не е правилно:
def inp_3():
while True:
s = raw_input(">>> ")
if s == '1':
return s
else:
print "wrong"
Тестът за inp_3 мислех, че ще бъде същият като за inp_2. Поне не получавам съобщения за грешка. Но резултатът е следният:
$ nosetests
......
# <- Here I press ENTER to provoke a reaction
# Nothing is happening though.
^C # <- Keyboard interrupt (is this the correct word for it?)
----------------------------------------------------------------------
Ran 7 tests in 5.464s
OK
$
Останалите 7 теста са sth. иначе (и добре). Тестът за inp_3 ще бъде тест №. 8. Времето е само времето, изминало докато натисна CTRL-C. Не разбирам защо не получавам съобщения за грешка или „неуспешен тест“, а само „ОК“.
Така че освен факта, че може да успеете да посочите лош синтаксис и други неща, които могат да бъдат подобрени (наистина бих го оценил, ако направите това), въпросът ми е:
Как мога да тествам и прекъсна цикли while с nosetest?