Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何检查我的主题是否引发异常?_Ruby_Rspec_Rspec3 - Fatal编程技术网

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