我目前正在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)
有关详细信息,请参阅
答案 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;
这种方式更准确,因为有时您的用例是期望不应抛出特定类型的异常(而允许抛出其他异常)。这种方法将涵盖此类用例。