2016-11-12 11 views
2

基本的に私は一連のRspec命令に答えようとしています。これらの命令の一つがこれです:RubyでRspecのraise_errorに応答しようとするとRaiseでエラーが発生しますか?

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)>' 

私はうまく動作しませんしてみてください任意の他の隆起のエラー、およびIこれを取る正しい方向を見つけるのに苦労している。多分私は間違った場所で探しているのでしょうか?

この質問をもう一度お詫び申し上げますが、私はすべてを試しましたが、何か誤りがありません。他のスレッドhere is the URLのコメントをチェックしたい場合

答えて

1

変更raise {"calculator is empty"}~raise("calculator is empty")raiseはブロックではなく文字列の引数をとることができます。

+0

答えてくれてありがとうしかし、誰行く:あなたはのようなよく知られているRubyのスタイルガイドへの外観を持っている場合があります。文字列がブロック内にある場合、コードが実際に実行される唯一の時間は変です。また、私はc9のIDEでこれをすべてやっていると言わなければなりません。私があなたのやり方で走ったとき、これは私が 'rspec spec/12_rpn_calculator_spec 'を得たエラーです。rb /usr/local/rvm/gems/ruby-2.3.0/gems/rspec-core-3.5.4/lib/rspec/core/configuration.rb:1435:in \ 'load ':/ home/ubuntu/(構文エラー) ... pop + @ array_nums.pop:raise ""または "計算機が空です " –

+0

3進演算子の内部に明示的な括弧が必要なように見えますが、それらを追加するために編集された答え。 – baseballlover723

+0

同じエラー、おそらくIDEと何か関係がありますか? rspecのraise_errorコードを文字列ではなく引数として使用するように変更したので、今すぐ動作します。おそらく適切な解決策ではありませんが、今のところそれが必要です。 –

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" 

- 最も知られているスタイルガイドは、ほとんどの場合には括弧を省略し、一部で例外として省略することができないように示唆しています。

さらに、あなたは1つだけで多くのことをやっているように感じます.3進数、2つのpopコール、割り当て、raiseがあります。そのため、コードは読みにくく、理解しにくく、エラーが発生しやすくなります。 ArgumentErrorを記述するようです:あなたは、私はまた、明示的exceptionの種類を教えてくれていることがわかります

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

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

:この特定の例では、私は、メソッドの開始時にガード句を使用すると、すべて三元を削除することをお勧め最高の問題を起こすそして私は変数に異なる名前をつけます。

各言語には、独自のスタイル、ベストプラクティス、命名規則、イディオムがあります。これらの規則を理解し、それに従うことは価値があります。

関連する問題