Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.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 - Fatal编程技术网

Ruby 如何对引发错误的块多次测试屈服控制?

Ruby 如何对引发错误的块多次测试屈服控制?,ruby,rspec,Ruby,Rspec,我想在RSpec中使用yield\u控件matcher,就像这样 expect {|b| some_method(&b) }.to yield_control.exactly(5).times 但是,我希望该块引发一个错误。是否有RSpec构造允许您这样做 基本上,我正在寻找一个类似RSpec mock对象的东西,它允许您在块屈服时引发错误,并计算它屈服的次数 我知道还有其他的方法,通过定义我自己的块来跟踪它被调用了多少次,但我希望有一个内置的可以这样做 示例: def some_me

我想在RSpec中使用
yield\u控件
matcher,就像这样

expect {|b| some_method(&b) }.to yield_control.exactly(5).times
但是,我希望该块引发一个错误。是否有RSpec构造允许您这样做

基本上,我正在寻找一个类似RSpec mock对象的东西,它允许您在块屈服时引发错误,并计算它屈服的次数

我知道还有其他的方法,通过定义我自己的块来跟踪它被调用了多少次,但我希望有一个内置的可以这样做

示例:

def some_method(&block)
  attempt = 0
  begin
    attempt += 1
    yield
  rescue => e
    retry if attempt < 3
  end
end

但是我希望我可以使用
expect{..}。来产生控制语法。

您是否希望块引发错误?有一个Rspec匹配器:我不确定我是否理解这里的问题?你能提供一个预期行为的例子吗?请参阅更新的问题。所以你想一次测试两个条件?您想测试它是否三次生成控件,然后引发错误?就像@diego.greyrobot所说的,我不认为有一种方法可以以任何有效的方式用一个单一的构造来实现这一点。是的,但这并不能测试控制被多次产生。对,你仍然需要将这个期望包装在你的另一个期望中,然后产生控制。没有一个构造可以同时完成这两个任务。对。我想这是一个有趣的测试用例。因为我可以测试它是否多次实际产生控件的唯一方法是让块引发错误。@DiegoSalazar请根据您的评论更新答案好吗?
number_of_times = 0
some_method do
  number_of_times += 1
  raise StandardError
end
expect(number_of_times).to eq(3)