4

我有这样的方法

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

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

4

2 回答 2

10

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

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

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

就像你的例子一样。

于 2014-01-08T15:40:33.880 回答
2

你可以存根返回错误

例如你有这样的方法类:

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
于 2020-12-21T09:08:34.530 回答