【问题标题】:One-liner shoulda syntax using braces使用大括号的单行应该语法
【发布时间】:2010-12-26 15:56:14
【问题描述】:

在 Rails Test Prescriptions (b10.0, page 176) 一书中,有如下单行断言示例:

should "be successful" { assert_response :success }

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

should "be successful"; do assert_response :success end

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

【问题讨论】:

    标签: ruby testing shoulda


    【解决方案1】:

    这是有效的 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
    

    【讨论】:

      【解决方案2】:

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

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

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

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

      should respond_with(:success)
      

      谢谢,

      诺埃尔

      【讨论】:

      • 嗯,很高兴有本书的作者在这里回复,谢谢 Noel!也感谢有关 respond_with 的提示,但当然我只是为语法示例选择了它。很高兴帮助清理勘误表!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      • 2016-12-04
      • 1970-01-01
      • 2020-05-02
      • 2015-11-13
      • 2019-04-12
      相关资源
      最近更新 更多