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

时间:2014-07-27 18:02:50

标签: 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设置为新对象的首选方法是什么?


更新

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

it { is_expected.not_to raise_error }

然后在expect块中使用it(正如Jimmy Cuadra所指出的那样):

it 'does not raise an error' do
  expect { subject }.not_to raise_error
end

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

其次,从RSpec 3.0.0.beta1开始,可以将raise_error与特定错误类一起使用。因此,以下内容无效:

expect { subject }.to raise_error(Some::Error)

有关详细信息,请参阅

2 个答案:

答案 0 :(得分:8)

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

describe MyClass do
  it "doesn't raise an exception when instantiated" do
    expect { subject }.not_to raise_error
  end
end 

答案 1 :(得分:7)

通过var_dump(array_keys($data)); 语法执行此操作的正确方法是使用Proc包装主题值,如下例所示:

struct counting_iterator
{
    size_t count;
    counting_iterator& operator++() { ++count; return *this; }
    // other iterator stuff
};

size_t count = set_intersection(
  s1.begin(), s1.end(), s2.begin(), s2.end(), counting_iterator()).count;

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