【问题标题】:Ruby case switch statement, execute every caseRuby case switch 语句,执行每个 case
【发布时间】:2015-07-16 21:44:52
【问题描述】:

我不是 Ruby 专家,所以请帮我一下:我想添加任何需要的代码,以便有一个选项可以执行以下 case 语句。基本上,如果用户在命令行中声明了一个“浏览器”名称,那么 Cucumber selenium 测试将针对某个平台/浏览器运行。我想要这样,如果他们声明“全部”,或者如果他们什么都不声明(其他),那么每个案例都将被执行。

谢谢

case ENV['BROWSER']
  when 'safari'
    $browser = Selenium::WebDriver.for :safari
    $browser_name = 'Safari'
  when 'mobile'
    $browser = Selenium::WebDriver.for :chrome
    $browser_name = 'Mobile'
    $browser.manage.window.resize_to(400, 650)
   else
   $browser = Selenium::WebDriver.for :chrome
   $browser_name = 'Chrome'
end

【问题讨论】:

  • 在 Ruby 中,$ 前缀变量像 $browser 是全局的,这些几乎总是麻烦,所以最好避免。

标签: ruby switch-statement


【解决方案1】:

那你就不想换了。 switch 语句的目的是不运行所有其他情况(它被设计为排他性的)。只需使用 if 语句代替。

实际上有几种方法可以设置ifs,但如果你想让它看起来有点像开关,这可能是你最好的选择:

if ENV['BROWSER'] == 'safari' || ENV['BROWSER'] == 'all'
  # do safari stuff
end
if ENV['BROWSER'] == 'mobile' || ENV['BROWSER'] == 'all'
  # do mobile stuff
end
if ENV['BROWSER'] == 'chrome' || ENV['BROWSER'] == 'all'
  # do chrome stuff
end

【讨论】:

  • 这看起来很简单,但我想知道,如果用户选择此处声明的“全部”选项,所有浏览器会同时执行还是连续执行?
  • @user1738702 连续。除非您以某种方式在线程环境中运行它。单线程程序必须等待它当前正在处理的任何事情结束,然后才能开始下一个位。
【解决方案2】:

如果您需要那种东西,case 语句只是解决方案的一部分。你也需要迭代。打破它有点不同:

BROWSERS = %w[ safari chrome mobile ]
BROWSER_ALIASES = {
  all: BROWSERS
}

# Interpret the environment variable as either an alias, or a single
# step to run.
browsers = BROWSER_ALIASES[ENV['BROWSER']] || [ ENV['BROWSER'] ]

browsers.each do |browser|
  case (browser)
  when 'safari'
    # ... Safari specific action
  when 'mobile'
    # ...
  end
end

此扩展允许您触发零个、一个或多个浏览器,并根据需要设置任意别名。

【讨论】:

  • 谢谢。我会试一试,看看我在哪里结束@tadman
猜你喜欢
  • 2014-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多