Могу ли я использовать RSpec для макета stdin / stdout для тестирования операций чтения и записи на консоли? - PullRequest
10 голосов
/ 13 июня 2011

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

line = STDIN.read.chomp.split

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

Ответы [ 2 ]

16 голосов
/ 14 июня 2011

Вы можете использовать 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 для получения дополнительной информации.

0 голосов
/ 06 марта 2019

RSpec 3.0 +

В RSpec 3.0 для этой цели есть выходное согласование :

expect { my_method }.to output("my message").to_stdout
expect { my_method }.to output("my error").to_stderr
...