rubyrspec

Ignoring exit when running Rspec


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

Solution

  • 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.