Тестировать выход в командной строке с помощью 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
Может кто-нибудь указать мне в правильном направлении?
Ответы
Ответ 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