18

私がしたいのは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

ここで、コマンドライン出力が実際に「I like Unix」ではなく「Hello from RSpec」であることを確認するために、rspec でテストを作成したいと考えています。

機能していません。私は現在、これを私の 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

誰かが私を正しい方向に向けることができますか?

4

4 に答える 4

26

これを行うにはかなり良い方法があります。hirb test_helper ソースからコピー:

def capture_stdout(&block)
  original_stdout = $stdout
  $stdout = fake = StringIO.new
  begin
    yield
  ensure
    $stdout = original_stdout
  end
  fake.string
end

次のように使用します。

output = capture_stdout { Hello.new.speak }
output.should == "Hello from RSpec\n"
于 2012-07-05T17:39:34.383 に答える
2

このquietlyコマンドはおそらくあなたが望むものです (ActiveSupport に組み込まれています。 api.rubyonrails.orgのドキュメントを参照してください)。以下の RSpec コードのスニペットは、stdout を同時にサイレンシングしながら、stderr に出力がないようにする方法を示しています。

quietly do                        # silence everything
  commands.each do |c|
    content = capture(:stderr) {  # capture anything sent to :stderr
      MyGem::Cli.start(c)
    }
    expect(content).to be_empty, "#{c.inspect} had output on stderr: #{content}"
  end
end
于 2013-08-17T20:06:09.077 に答える
-5
it "should say 'Hello from Rspec' when run" do        
  output = `ruby sayhello.rb`
  output.should == 'Hello from RSpec'   
end
于 2013-12-07T16:48:42.927 に答える