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

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

should "be successful" { assert_response :success }

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

should "be successful"; do assert_response :success end

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

这是有效的Ruby语法。 好吧,有点。 它没有意义!

由于使用花括号的文字块的优先级高于传递没有括号的参数,因此块将绑定到参数而不是方法调用。 如果参数本身是一个方法调用,那么你甚至不会得到语法错误。 你只是想知道为什么你的块没有被调用。

要解决此问题,您可以在参数周围加上括号,因为括号的优先级高于花括号,或者使用do / endforms,它的优先级低于没有括号的参数列表。

 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) 

谢谢,

诺埃尔