0

Rails Test Prescriptions(b10.0、176ページ)の本には、次のようなワンライナーアサーションの例があります。

should "be successful" { assert_response :success }

これは私には有効なruby構文ではないようで、rubyは左中括弧が予期しないものであると報告しています。解析するには、次のように変更する必要があります

should "be successful"; do assert_response :success end

最初の例の構文の何が問題になっていますか?

4

2 に答える 2

4

これは有効なRuby構文です。まあ、ある種。それは意味がありません!

中括弧を使用したリテラルブロックの優先順位は、括弧なしで引数を渡すよりも高いため、ブロックはメソッド呼び出しではなく引数にバインドされます。引数自体がメソッド呼び出しである場合、構文エラーも発生しません。なぜブロックが呼び出されないのか疑問に思って頭をかきむしります。

これを修正するには、括弧は中括弧よりも優先順位が高いため、引数を括弧で囲むか、括弧なしの引数リストよりも優先順位が低いdo/形式を使用します。end

def foo; yield if block_given?; 'foo' end

puts foo { puts 'block' }
# block
# foo

puts(foo) { puts 'block' }
# foo

puts foo do puts 'block' end
# foo

puts foo { puts 'block' }, foo { puts 'block' }
# block
# block
# foo
# foo

puts 'foo' { puts 'block' }
# SyntaxError: (irb):19: syntax error, unexpected '{', expecting $end
于 2010-12-26T17:24:21.133 に答える
2

これは、例で使用する行数を少なくしようとする私の側の間違いかもしれません。Jorgが言ったように、ブロックはおそらくメソッド呼び出しではなく引数にバインドされています。

これをワンライナーとして書き直す適切な方法は次のとおりです。

should("be successful") { assert_response :success }

しかし、実際には、shouldaマクロを使用する方法があります。

should respond_with(:success)

ありがとう、

ノエル

于 2011-01-02T16:33:39.123 に答える