Ruby Rspec 对捕获的异常的消息期望

Posted

技术标签:

【中文标题】Ruby Rspec 对捕获的异常的消息期望【英文标题】:Ruby Rspec message expectations for a caught exception 【发布时间】:2014-02-28 00:22:46 【问题描述】:

Rspec 有没有办法为捕获的异常设置期望?我想验证是否引发了 MyException,但由于我正在捕获异常,Rspec 似乎并不知道它曾经发生过。

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

我尝试了一些类似以下的方法,但均未成功。 MyException.should_receive(:new)Kernel.should_receive(:raise).with(MyException)

【问题讨论】:

【参考方案1】:

您可以测试救援块的行为而不是检查异常:

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

【讨论】:

【参考方案2】:

我想出了如何做我需要的事情。

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

感谢您的其他建议。

【讨论】:

【参考方案3】:

我会这样做:

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

Rspec Documentation逐字复制

【讨论】:

如果你没有捕捉到异常,你会这样做,但我正在捕捉它。我想验证异常是否被引发,然后被捕获。 @Preffect 存根引发异常的方法/动作作为针对​​该异常的测试

以上是关于Ruby Rspec 对捕获的异常的消息期望的主要内容,如果未能解决你的问题,请参考以下文章

如何在对引发异常的 C# webmethod 的 ajax 调用上指定消息?

ruby 具有期望语法的Rspec Rails备忘单(包括capybara匹配器)

是否有RSpec等效的RSpec来做TDD?

调试 Rspec Postgres 锁定

ruby 扩展RSpec :: Matchers :: BuiltIn :: Match的自定义匹配器也可以指定捕获组。

rspec 显示错误信息