使用RSpec测试输出到命令行

the*_*nso 17 ruby testing rspec

我想做的是ruby sayhello.rb在命令行上运行,然后接收Hello from Rspec.

我有这个:

class Hello
  def speak
    puts 'Hello from RSpec'
  end
end

hi = Hello.new #brings my object into existence
hi.speak
Run Code Online (Sandbox Code Playgroud)

现在我想在rspec中编写一个测试来检查命令行输出实际上是"来自RSpec的Hello"而不是"我喜欢Unix"

不工作.我目前在sayhello_spec.rb文件中有这个

require_relative 'sayhello.rb' #points to file so I can 'see' it

describe "sayhello.rb" do
  it "should say 'Hello from Rspec' when ran" do        
    STDOUT.should_receive(:puts).with('Hello from RSpec')    
  end
end
Run Code Online (Sandbox Code Playgroud)

有人能指出我正确的方向吗?

Cas*_*per 25

这是一个非常好的方法.从hirb test_helper源复制:

def capture_stdout(&block)
  original_stdout = $stdout
  $stdout = fake = StringIO.new
  begin
    yield
  ensure
    $stdout = original_stdout
  end
  fake.string
end
Run Code Online (Sandbox Code Playgroud)

使用这样:

output = capture_stdout { Hello.new.speak }
output.should == "Hello from RSpec\n"
Run Code Online (Sandbox Code Playgroud)

  • 构建于此:def expect_stdout(string,&block); output = capture_stdout(&block); output.should包含字符串; 结束 (2认同)