【问题标题】:DRYing out the path.rb干燥路径.rb
【发布时间】:2013-03-07 01:10:17
【问题描述】:

我是黄瓜新手,想问一下如何把这段代码干掉(不包含错误):

when /^the user page$/
  users_path

when /^the review page$/
  reviews_path

我尝试使用正则表达式

when /^the (.+) page$/
  $1.to_s+'s_path'

但显然这是错误的。提前致谢!

解决方案(基于aledalgrande 的回答):

when /^the (.+) page$/ 
 send("#{$1}s_path")

【问题讨论】:

    标签: ruby-on-rails cucumber dry


    【解决方案1】:

    这应该可行:

    When /^the "(.+)" page$/ do |destination|
      send("#{destination}s_path")
    end
    

    【讨论】:

    • 它看起来更好,但不幸的是不起作用。感谢您建议“发送”。
    • 在这个版本中它给出了一个语法错误。当我在 |destination| 之前插入 do 时,我得到了syntax error, unexpected keyword_do, expecting keyword_then or ',' or ';' or '\n' when /^the (.+) page$/ do |destination|。然后我将 do 替换为 then 并得到syntax error, unexpected '|'。进一步使用您的代码,我通过如下更改使其工作when /^the (.+) page$/ send("#{$1}s_path")非常感谢!
    • 更改为包含省略的 do 和引号。奇怪的是它不适合你使用这种语法。
    • 不能争论哪个解决方案“更短”,但我个人认为这个解决方案更像是一种 hack,然后是 DRY。想象一下您的测试中有一个错字“当评审路径”。从现在起一个月后,您需要多长时间才能找到它? “找不到从评论到路径的映射”的秒数。?尝试将其转换为成本。
    • 你是对的,但是这样想,我就不需要更改我开始使用的代码了。我说的对吗?
    【解决方案2】:

    您可以添加:

    features/support/paths.rb

    module PathHelpers
      def path_to(page_name)
        case page_name
        when /user/i
          users_path
        when /review/i
          reviews_path
        when /home/i
          root_path
        #add custom here
        else
          raise "Can't find mapping from \"#{page_name}\" to a path."
        end
      end
    end
    
    World(PathHelpers)
    

    然后调用它:

    when /^the (.+) page$/ do |page|
      visit path_to(page)
    end
    

    【讨论】:

    • 您定义了一个助手,并在一个地方需要更改行为、添加新路径,而无需查看代码中的其他任何地方。我认为它是干燥的。 DRY 并不是说​​要少写几行代码,而是要编写一个可以在一个地方轻松修改的代码。我用一个电话来更新答案,有一段时间没有使用黄瓜了,但可能需要它。
    • 谢谢!我希望您的版本有效,尽管我刚刚添加的解决方案似乎更简洁。感谢您的建议!
    猜你喜欢
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多