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

时间:2014-01-08 15:13:09

标签: ruby-on-rails ruby rspec rescue

我有这样的方法

def className  
  def method_name
    some code  
  rescue  
    some code and error message  
  end  
end

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

2 个答案:

答案 0 :(得分:8)

如果您想要营救,则意味着您希望some code引发某种异常。

您可以使用RSpec stubs伪造实施并强制执行错误。假设执行块包含可能引发的方法

def method_name
  other_method_that_may_raise
rescue => e
  "ERROR: #{e.message}"
end

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

it " ... " do
  subject.stub(:other_method_that_may_raise) { raise "boom" }
  expect { subject.method_name }.to_not raise_error
end

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

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

毋庸置疑,你应该提出一个错误,它可能是真正的实现而不是一般错误引发的

{ raise FooError, "boom" }

并且只保留Error,假设这是相关的。


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

class ClassName

def className

如你的例子所示。

答案 1 :(得分:1)

你可以存根返回错误

例如你有这样的方法的类:

class Email
  def self.send_email
    # send email
  rescue
    'Error sent email'
  end
end

所以引发错误的 rspec 是

context 'when error occures' do
  it 'should return error message' do
    allow(Email).to receive(:send_email) { err }
    expect(Email.send_email).to eq 'Error sent email brand'
  end
end