如何写下rspec来测试救援块.

Dhe*_*eer 3 ruby rspec ruby-on-rails rescue

我有这样的方法

def className  
  def method_name
    some code  
  rescue  
    some code and error message  
  end  
end
Run Code Online (Sandbox Code Playgroud)

那么,如何写下rspec来测试救援块..?

Sim*_*tti 8

如果你想拯救,这意味着你期望some code引发某种异常.

您可以使用RSpec存根来伪造实现并强制发生错误.假设执行块包含可能引发的方法

def method_name
  other_method_that_may_raise
rescue => e
  "ERROR: #{e.message}"
end
Run Code Online (Sandbox Code Playgroud)

在您的规范中将存根挂钩到该方法

it " ... " do
  subject.stub(:other_method_that_may_raise) { raise "boom" }
  expect { subject.method_name }.to_not raise_error
end
Run Code Online (Sandbox Code Playgroud)

您还可以通过测试结果来检查救援处理程序

it " ... " do
  subject.stub(:other_method_that_may_raise) { raise "boom" }
  expect(subject.method_name).to eq("ERROR: boom")
end
Run Code Online (Sandbox Code Playgroud)

不用说,你应该提出一个错误,它可能是由真正的实现而不是一般错误引发的

{ raise FooError, "boom" }
Run Code Online (Sandbox Code Playgroud)

Error假设这是相关的,只能拯救它.


作为旁注,在Ruby中,您可以使用以下命令定义一个类:

class ClassName
Run Code Online (Sandbox Code Playgroud)

def className
Run Code Online (Sandbox Code Playgroud)

在你的例子中.

  • 当我试图期望方法在它已经被方法拯救时引发错误时,它不起作用。 (2认同)