Чтобы понять, как работает «and_yield»: я не думаю, что «and_return» действительно то, что вы хотите здесь. Это установит возвращаемое значение блока File.open, а не строки, приведенные к его блоку. Чтобы немного изменить пример, скажем, у вас есть это:
рубин
def parse(fname)
lines = []
File.open(fname){ |line| lines << line*2 }
end
Rspec
describe Parser do
it 'should yield each line' do
File.stub(:open).and_yield('first').and_yield('second')
parse('nofile.txt').should eq(['firstfirst','secondsecond'])
end
end
Пройдет. Если вы заменили эту строку на «and_return», как
File.stub(:open).and_return(['first','second'])
Сбой из-за обхода блока:
expected: ["firstfirst", "secondsecond"]
got: ["first", "second"]
Таким образом, в нижней строке используется 'and_yield', чтобы смоделировать ввод для блоков каждого типа. Используйте 'and_return' для проверки вывода этих блоков.