Ruby 如何检查我的主题是否引发异常?
我目前正在Ruby 如何检查我的主题是否引发异常?,ruby,rspec,rspec3,Ruby,Rspec,Rspec3,我目前正在subject中创建一个对象,需要测试这是否引发异常。以下代码说明了我试图实现的目标: describe MyClass do describe '#initialize' do subject { MyClass.new } it { is_expected.not_to raise_error(Some::Error) } end end 我觉得我走错了方向。在不创建两次对象的情况下,将主题设置为新对象的首选方法是什么 更新 我的问题是双重的。首先,这
subject
中创建一个对象,需要测试这是否引发异常。以下代码说明了我试图实现的目标:
describe MyClass do
describe '#initialize' do
subject { MyClass.new }
it { is_expected.not_to raise_error(Some::Error) }
end
end
我觉得我走错了方向。在不创建两次对象的情况下,将主题设置为新对象的首选方法是什么
更新
我的问题是双重的。首先,这种语法不起作用:
it { is_expected.not_to raise_error }
但是,在it
块中使用expect
(正如Jimmy Cuadra所指出的):
我对RSpec不太熟悉,无法告诉您这是为什么
其次,因为,不再可能对特定的错误类别使用raise\u error
。因此,以下内容无效:
expect { subject }.to raise_error(Some::Error)
有关详细信息,请参阅
如果我理解正确,您正在尝试测试实例化类是否会导致异常。你可以这样做:
describe MyClass do
it "doesn't raise an exception when instantiated" do
expect { subject }.not_to raise_error
end
end
通过语法实现这一点的正确方法是通过Proc包装主题值,如以下示例所示:
describe MyClass do
describe '#initialize' do
subject { -> { MyClass.new } }
it { is_expected.not_to raise_error(Some::Error) }
end
end
这种方法更准确,因为有时候您的用例期望不抛出特定类型的异常(而允许抛出其他异常)。此方法将涵盖此类用例。您有一个主题,因此不需要主题{MyClass.new}
。方便知道,@ArupRakshit!虽然我的简化示例中的构造函数没有带参数,但是,我实际类中的构造函数有带参数。我接受这一点,因为它确实是我问题的答案。我已经更新了这个问题,以防其他人有类似的问题,因为还有另一个问题。这里的关键是你需要将主题
放在expect
块中。您不能使用它{is_expected.not_raise_error}
,您可以使用expected{subject.not_raise_error}
。您需要使用expect{subject}.not\u来引发错误
。为答案干杯。是的,是的。只需确保您的RSpec版本支持is_expected
方法。看起来它只是检查Proc对象是否引发异常@olegafanasysev Yes。基本上,raise\u error
将在内部调用过程中的.call
,该过程由主题
@leandroico存储/返回,我在源代码中没有发现任何.call
调用,也没有发现为评估procs的主题创建一个特例是有意义的,因为主题已经包装在expect{}中
块,直到测试运行时才会调用。@Olegafanasysev我相信这种基于过程的行为来自raise\u error
而不是其他原因。
describe MyClass do
describe '#initialize' do
subject { -> { MyClass.new } }
it { is_expected.not_to raise_error(Some::Error) }
end
end