Вы можете использовать range
Например:
data=[]
for _ in range(2):
name = raw_input("Please enter your name: ")
age = int(raw_input("Please enter your age: "))
height = int(raw_input("Please enter your height: "))
data.append((name, age, height))
print(data)
<час> Или: , используя цикл while.
data=[]
while True:
name = raw_input("Please enter your name: ")
age = int(raw_input("Please enter your age: "))
height = int(raw_input("Please enter your height: "))
data.append((name, age, height))
if len(data) == 2:
break
print(data)
У меня нет компьютера с Ruby & RSpec доступным для проверки этого, но я подозреваю, что необходимо добавить вызов к and_yields
звоните [1] на конце should_receive(:each)
. Однако Вы могли бы найти более простым не использовать насмешки в этом случае, например, Вы могли возвратить a StringIO
экземпляр, содержащий linetext
от File.open
тупик.
[1] http://rspec.rubyforge.org/rspec/1.1.11/classes/Spec/Mocks/BaseExpectation.src/M000104.html
Я пошел бы с идеей заблокировать вызов File.open
lines = "RCS file: hello,v\n", "bla bla bla\n"
File.stub!(:open).and_return(lines)
Это должно быть достаточно хорошо для тестирования кода в цикле.
Это должно добиться цели:
describe Parser
before do
@parser = Parser.new
end
it "should extract a filename into extracted" do
linetext = [ "RCS file: hello,v\n", "bla bla bla\n" ]
File.should_receive(:open).with("somefile.txt").and_return(linetext)
@parser.parse("somefile.txt")
@parser.extracted.should == "hello"
end
end
Существуют некоторые ошибки в классе Синтаксического анализатора (он не пройдет тест), но это - то, как я записал бы тест.