在 Rails Test Prescriptions (b10.0, page 176) 一书中,有如下单行断言的示例:
should "be successful" { assert_response :success }
这对我来说似乎不是有效的 ruby 语法,并且 ruby 报告左大括号是意外的。为了对其进行解析,我必须将其更改为
should "be successful"; do assert_response :success end
第一个示例的语法有什么问题?
这是有效的 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
这可能是我试图让示例占用更少行的错误。正如 Jorg 所说,该块可能绑定到参数而不是方法调用。
我认为将其重写为单行的正确方法是:
should("be successful") { assert_response :success }
但实际上,要走的路是使用 shoulda 宏:
should respond_with(:success)
谢谢,
诺埃尔