如何检查我的主题是否引发异常?

Jam*_*bri 6 ruby rspec rspec3

我正在创建一个对象,subject并且需要测试是否会引发异常.以下代码说明了我正在尝试实现的目标:

describe MyClass do
  describe '#initialize' do
    subject { MyClass.new }

    it { is_expected.not_to raise_error(Some::Error) }
  end
end
Run Code Online (Sandbox Code Playgroud)

我有一种感觉,我会以错误的方式来做这件事.在subject不创建对象两次的情况下,将对象设置为新对象的首选方法是什么?


更新

我的问题是双重的.首先,这种语法不起作用:

it { is_expected.not_to raise_error }
Run Code Online (Sandbox Code Playgroud)

然而,expect在一个it区块内部使用(正如Jimmy Cuadra所指出的那样):

it 'does not raise an error' do
  expect { subject }.not_to raise_error
end
Run Code Online (Sandbox Code Playgroud)

我不熟悉RSpec告诉你为什么会这样.

其次,自RSpec 3.0.0.beta1以来,可以使用raise_error特定的错误类.因此,以下内容无效:

expect { subject }.to raise_error(Some::Error)
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅

Jim*_*dra 9

如果我理解正确,那么你试图测试实例化一个类是否会导致异常.你会这样做:

describe MyClass do
  it "doesn't raise an exception when instantiated" do
    expect { subject }.not_to raise_error
  end
end 
Run Code Online (Sandbox Code Playgroud)


lea*_*ico 7

通过is_expected语法执行此操作的正确方法是使用Proc包装主题值,如下例所示:

describe MyClass do
  describe '#initialize' do
    subject { -> { MyClass.new } }
    it      { is_expected.not_to raise_error(Some::Error) }
  end
end
Run Code Online (Sandbox Code Playgroud)

这种方式更准确,因为有时您的用例是期望不应抛出特定类型的异常(而允许抛出其他异常).这种方法将涵盖此类用例.