我正在创建一个对象,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)
有关更多信息,请参阅
如果我理解正确,那么你试图测试实例化一个类是否会导致异常.你会这样做:
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)
通过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)
这种方式更准确,因为有时您的用例是期望不应抛出特定类型的异常(而允许抛出其他异常).这种方法将涵盖此类用例.