3

In Ruby, I need to print a feedback message and then exit with a status code of 1.

class Foo
  def bar
    puts "error"
    exit 1
  end
end

In RSpec, how can I ignore exit 1 when expecting the feedback message to be printed?

it "returns a feedback message" do
  expect { Foo.new.bar }.to output(/no error/i).to_stdout
end

If I run the spec above, no failure is raised.

Finished in 0.02402 seconds (files took 0.17814 seconds to load)
1 example, 0 failures

2 Answers 2

4

exit raises a SystemExit error. You can rescue it like any other error or expect to raise_error:

RSpec.describe Foo do
  it "returns a feedback message" do
    expect { Foo.new.bar }
      .to output(/no error/i).to_stdout
      .and raise_error(SystemExit)
  end
end
Sign up to request clarification or add additional context in comments.

1 Comment

Nice one, I always forget, that Ruby's exit doesn't exit right away. (which is what exit! does)
3

You could use allow to capture the exit message inside your Foo instance:

describe '#bar' do
  let(:foo) { Foo.new }

  it "returns a feedback message" do
    allow(foo).to receive(:exit)
    expect { foo.bar }.to output(/no error/i).to_stdout
  end
end

This will effectively install a new method Foo#exit that does nothing by default, see the RSpec docs on Allowing messages.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.