Подтвердить что ты не робот

Тестировать выход в командной строке с помощью 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

Теперь я хочу написать тест в rspec, чтобы проверить, что вывод командной строки на самом деле "Hello from RSpec" а не "мне нравится 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

Может кто-нибудь указать мне в правильном направлении?

4b9b3361

Ответ 1

Вот довольно хороший способ сделать это. Скопировано из источника 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"

Ответ 2

Команда quietly, вероятно, вы хотите (готовили в ActiveSupport, см. документы в api.rubyonrails.org). Этот фрагмент кода RSpec ниже показывает, как обеспечить отсутствие вывода на stderr при одновременном отключении stdout.

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

Ответ 3

it "should say 'Hello from Rspec' when run" do        
  output = `ruby sayhello.rb`
  output.should == 'Hello from RSpec'   
end