使用Raise尝试回答Rspec在Ruby中的raise_error时不断出错?

时间:2016-11-12 04:46:58

标签: ruby rspec raiserror

基本上我试图回答一系列Rspec指令。其中一条说明就是:

it "fails informatively when there's not enough values stacked away" do
  expect {
     calculator.plus
  }.to raise_error("calculator is empty")
end

所以我了解了raise_error以及如何回答它,是我创建某种错误/异常。

def plus
  @array_nums.length >= 2 ? @array_nums << @array_nums.pop + @array_nums.pop : raise {"calculator is empty"}
  @value = @array_nums[-1]

要清楚底部有一个结尾,但文本编辑器没有处理它。所以我提出错误,我试图提出ArgumentError等等,但我不断从rspec得到这个回复:

Failure/Error:
   expect {
     calculator.plus
   }.to raise_error("calculator is empty")

   expected Exception with "calculator is empty", got RuntimeError with backtrace:
     # ./lib/12_rpn_calculator.rb:16:in `plus'
     # ./spec/12_rpn_calculator_spec.rb:119:in `block (3 levels) in <top (required)>'
     # ./spec/12_rpn_calculator_spec.rb:118:in `block (2 levels) in <top (required)>'
 # ./spec/12_rpn_calculator_spec.rb:118:in `block (2 levels) in <top (required)>'

我尝试过的任何其他错误的错误都不起作用,而我正在努力找到正确的方向来接受这个。也许我在找错了地方?

很抱歉再次提出这个问题,但我已尝试过所有内容,并且不想发生任何错误。如果要检查其他线程here is the URL的注释。

2 个答案:

答案 0 :(得分:3)

这里的主要问题是Kernel#raise不接受块({...})作为参数。它接受异常或字符串。

您面临的下一个问题是缺少括号。虽然在很多情况下你可以省略括号,但你不能一直这样做。原因是operator precedences不同。运算符优先级可能会使开发人员感到困惑,并导致Ruby以意想不到的方式读取代码。例如:

condition ? operation : raise "calculator is empty"

# what the devs thinks Ruby would understand:
condition ? operation : raise("calculator is empty")

# what Ruby really understands:
(condition ? operation : raise) "calculator is empty"

事实上 - 大多数已知的样式指南建议在大多数情况下不要省略括号,并允许在某些情况下省略作为例外。

此外,我觉得你只想在一个人身上做很多事情:有三个,两个pop来电,一个任务和一个raise。这使得代码难以阅读,难以理解且容易出错。在这个特定的例子中,我建议在方法的开头使用一个保护条款,并删除三元组:

def plus
  raise(ArgumentError, 'calculator is empty') if @numbers.length < 3

  @numbers << @numbers.pop + @numbers.pop
  # ...

你会注意到我也明确告诉我exception的类型:ArgumentError似乎最能描述这个问题。我会以不同的方式命名变量。

每种语言都有自己的风格,最佳实践,命名惯例和习语。值得理解并遵循这些惯例。您可能想要了解一个众所周知的Ruby样式指南,如:

答案 1 :(得分:1)

raise {"calculator is empty"}更改为raise("calculator is empty")raise可以采用字符串参数而不是块。