Могу ли я использовать RSpec для издевательства stdin/stdout для проверки чтения и записи консоли?

Моя программа Ruby считывает строки из stdin и использует puts для печати на stdout (терминал). Могу ли я использовать RSpec для проверки чтения и записи? Могу ли я вставить строку в свою программу, как это было написано в stdin, и в то же время проверить вывод?

line = STDIN.read.chomp.split

Кроме того, у меня есть записи и записи в цикле, пока line[0] не будет "quit". Могу ли я тестировать, пока цикл работает, или я должен называть subject.read_in и subject.write_out?

Ответ 1

Вы можете использовать mocks и вызывать метод, который вызывается более одного раза, путем перечисления нескольких значений в методе and_return(). Они будут возвращены, по одному на каждый вызов, в указанном порядке.

STDIN.should_receive(:read).and_return("Your string")

STDIN.should_receive(:read).and_return("value1", "value2", "value3")

Вы можете делать похожие вещи с помощью STDOUT:

STDOUT.should_receive(:puts).with("string")

Дополнительную информацию см. в RSpec mocking documentation.