在愚蠢的块上失败的rspec测试

时间:2013-06-25 06:28:22

标签: ruby rspec repeater block

您好,请查看我的代码并告诉我有什么问题,因为它失败了rspec但是在repl.it上工作。我不理解rspec的反馈。 失败/错误:n.should == 3 期待:3 得到:0(使用==)

我的代码:

def repeater(x=0)
  if x == 0
    return yield
  else
    x.times do |n|
      n += 1
    end
  end
end

它通过了以下第一次测试:

 describe "repeater" do
    it "executes the default block" do
      block_was_executed = false
      repeater do
        block_was_executed = true
      end
      block_was_executed.should == true
    end
    it "executes the default block 3 times" do
      n = 0
      repeater(3) do
        n += 1
      end
      n.should == 3
    end

    it "executes the default block 10 times" do
      n = 0
      repeater(10) do
        n += 1
      end
      n.should == 10
    end

  end

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

这在控制台上也不起作用,因为n是在repeater方法的块范围内定义的。您在控制台上看到的是times块返回的值,但如果您检查n的值,它仍将为零。

如果您将转发器方法更改为:

def repeater(x=0)
  if x == 0
    return yield
  else
    x.times do |n|
      yield
    end
  end
end 

然后规范将通过,因为n的引用将由调用上下文给出

答案 1 :(得分:0)

Rspec告诉你出了什么问题。你希望n为3,但它是0。

您的规范:

n = 0
repeater(3) do
  n +=1
end
n.should == 3

我不确定你为什么要传递一个块,因为它被完全忽略了,但是你可能正在测试该块被忽略而且你的函数按预期运行。

如果给定非零值,您的函数将产生一个奇怪的循环。循环本身不做任何事情,循环产生的值为x

因此,对转发器的调用将返回传入的任何值,如果它不为零。但是,由于您忽略了返回值,因此在您的规范中无关紧要。

所以你基本上把n设置为0,不要对它做任何事情,然后期望它等于3当然会失败。

答案 2 :(得分:0)

这是我解决您问题的方法。块和产量很强大。还在学习自己掌握它。

def repeater(num = 0,& block)

return block.call if num==0

   num.times do |n|
      block.call
   end

如果你想折射成一行。见下文

def repeater(num = 0,& block)

  return block.call if num==0; num.times { |n| block.call}