ruby - 我可以使用 RSpec 模拟标准输入/标准输出来测试控制台读写吗?

标签 ruby rspec stdout stdin

我的 Ruby 程序从 stdin 读取行并使用 puts 打印到 stdout(终端)。我可以使用 RSpec 来测试读写吗?我可以像在 stdin 中编写的那样向我的程序注入(inject)一个字符串,同时检查输出吗?

line = STDIN.read.chomp.split

另外,我在一个循环中进行读取和写入,直到 line[0] 被“退出”。我可以在循环运行时进行测试,还是应该调用 subject.read_insubject.write_out

最佳答案

您可以使用模拟并通过在 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获取更多信息。

关于ruby - 我可以使用 RSpec 模拟标准输入/标准输出来测试控制台读写吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6335282/

相关文章:

ruby - 启用 `let` 以在 block 传递给 RSpec 共享示例的情况下分配形式参数

ruby-on-rails - 如果文件被删除,如何在 rspec 中进行测试?

c - 输出utf-8到控制台

C 段错误源于读取标准输入然后操作该数据

ruby - ActiveModel::匿名类的验证

ruby - Rails 事件记录 : Calling Build Method Should Not Save To Database Before Calling Save Method

ruby-on-rails - Michael Hartl 教程第 11 章中的 "undefined method ` find_by '"

ruby - protected 和私有(private)方法

ruby - 在 Ruby 中比较两个 lambdas/Procs

linux - 将 stdout 和 stderr 恢复为默认值