如何使用RSpec测试方法是否捕获符号?

时间:2018-06-02 22:53:45

标签: ruby rspec

如何测试方法是否在RSpec中捕获抛出的符号?我有两种方法可以通过#throw和#catch相互交互。我已经想出如何测试符号被抛出的一端:

expect { subject.method_a }.to throw_symbol(:some_symbol)

现在我想测试一下method_b捕获抛出的符号,我想这可能看起来像这样:

expect { subject.method_b }.to catch_symbol(:some_symbol)

只有这不起作用。所以我的问题是,你怎么测试一个方法在RSpec中捕获一个符号?

编辑:这是method_a和method_b的一个非常基本的例子,剥离了与手头问题无关的所有逻辑。

def method_a 
  throw :some_symbol
end

def method_b
  catch :some_symbol do 
    method_a
  end
end

1 个答案:

答案 0 :(得分:1)

catchthrow是内核上的方法,因此您可以照常使用它们:

class SomeClass
  def a
    throw :foo
  end

  def b
    catch :foo do
      a
    end
  end
end

RSpec.describe "" do
  it "" do
    inst = SomeClass.new
    expect(inst).to receive(:throw).with(:foo)
    inst.a
    expect(inst).to receive(:catch).with(:foo)
    inst.b
  end
end