Как я могу проверить выходы и аварийные прекращения работы в RSpec?

42
задан cfeduke 26 September 2009 в 06:02
поделиться

3 ответа

попробуйте следующее:

module MyGem
  describe "CLI" do
    context "execute" do

      it "should exit cleanly when -h is used" do
        argv=["-h"]
        out = StringIO.new
        lambda { ::MyGem::CLI.execute( out, argv) }.should raise_error SystemExit
      end

    end
  end
end
26
ответ дан 26 November 2019 в 23:51
поделиться

Покопавшись, я нашел это .

Мое решение выглядело так:

# something.rb
class Something
    def initialize(kernel=Kernel)
        @kernel = kernel
    end

    def process_arguments(args)
        @kernel.exit
    end
end

# something_spec.rb
require 'something'
describe Something do
    before :each do
        @mock_kernel = mock(Kernel)
        @mock_kernel.stub!(:exit)
    end

    it "should exit cleanly" do
        s = Something.new(@mock_kernel)
        @mock_kernel.should_receive(:exit)
        s.process_arguments(["-h"])
    end
end
2
ответ дан 26 November 2019 в 23:51
поделиться

Спасибо за ответ, Маркус. Как только я получу эту подсказку, я смогу собрать хороший сопоставитель для будущего использования.

it "should exit cleanly when -h is used" do
  lambda { ::MyGem::CLI.execute( StringIO.new, ["-h"]) }.should exit_with_code(0)
end
it "should exit with error on unknown option" do
  lambda { ::MyGem::CLI.execute( StringIO.new, ["--bad-option"]) }.should exit_with_code(-1)
end

Чтобы использовать этот сопоставитель, добавьте это в свои библиотеки или помощники по спецификациям:

RSpec::Matchers.define :exit_with_code do |exp_code|
  actual = nil
  match do |block|
    begin
      block.call
    rescue SystemExit => e
      actual = e.status
    end
    actual and actual == exp_code
  end
  failure_message_for_should do |block|
    "expected block to call exit(#{exp_code}) but exit" +
      (actual.nil? ? " not called" : "(#{actual}) was called")
  end
  failure_message_for_should_not do |block|
    "expected block not to call exit(#{exp_code})"
  end
  description do
    "expect block to call exit(#{exp_code})"
  end
end
17
ответ дан 26 November 2019 в 23:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: