One-liner应该使用大括号语法

时间:2010-12-26 15:56:14

标签: ruby testing shoulda

在Rails Test Prescriptions(b10.0,第176页)一书中,有一些单行断言的例子如下:

should "be successful" { assert_response :success }

这对我来说似乎不是有效的ruby语法,并且ruby报告左大括号是意外的。为了解析它,我必须将其更改为

should "be successful"; do assert_response :success end

第一个例子的语法出了什么问题?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

这可能是我试图让这个例子占用更多行的错误。正如Jorg所说,该块可能绑定到参数而不是方法调用。

我认为将其重写为单行的正确方法是:

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

但实际上,要走的路是使用shoulda宏:

should respond_with(:success)

谢谢,

诺尔