Rspec:如何测试递归?

cri*_*spy 8 ruby recursion rspec mocking

我想测试一个方法是用一个特定的参数递归调用的.

我的方法:

class Recursable
  def rec(arg)
    rec(7) unless arg == 7
  end
end

describe Recursable do
  it "should recurse" do
    r = Recursable.new('test')
    r.should_receive(:rec).with(0).ordered
    r.should_receive(:rec).with(7).ordered
    r.rec(0)
  end
end
Run Code Online (Sandbox Code Playgroud)

出乎意料的是,RSpec失败了:

expected :rec with (7) once, but received it 0 times
Run Code Online (Sandbox Code Playgroud)

知道我的方法有什么问题吗?如何使用特定参数测试有效递归?

Nic*_*wis 10

您的测试现在的问题是您正在试验您要测试的方法.r.should_receive(:rec)正在替换r#rec存根,当然这个存根不会调用r.rec(7).

更好的方法是简单地测试初始方法调用的结果是否正确.只要它最终给出了正确的答案,该方法是否可以递归,迭代或给朋友打电话都不应该严格.

  • 换句话说:不要测试实现,测试代码的效果.很棒的答案! (2认同)