Pergunta

Is there any way with Rspec to set an expectation for an exception that gets caught? I want to verify that MyException gets raised, but since I am catching the exception Rspec does not appear to know it ever happened.

begin
  if success
    do good stuff
  else
    raise MyException.new()
  end
rescue MyException => e
  clean up
end

I've tried a few things like the following without success. MyException.should_receive(:new) and Kernel.should_receive(:raise).with(MyException)

Foi útil?

Solução 2

I figured out how to do what I needed.

class MyClass
  def my_method
    begin
      if success
        do good stuff
      else
        raise MyException.new
      end
    rescue MyException => e
      # clean up
    end
  end
end

describe MyClass do
  it "Expects caught exception" do
    my_instance = MyClass.new()
    my_instance.should_receive(:raise).with(any_instance_of(MyException))
    my_instance.my_method()
  end
end

Thanks for your other suggestions.

Outras dicas

You could test the behavior of the rescue block instead of checking for the exception:

class Test
  def my_method
    if success
      # do good stuff
    else
      raise MyException.new()
    end
  rescue MyException => e
    clean_up
  end
end

describe Test do
  it "should clean up when unsuccessful" do
    subject.stub(:success) { false }
    subject.should_receive(:clean_up)
    subject.my_method
  end
end

I would do as below:

RSpec.describe "matching error message with string" do
  it "matches the error message" do
    expect { raise StandardError, 'this message exactly'}.
      to raise_error('this message exactly')
  end
end

copied verbatim from Rspec Documentation

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top