watir,cucumber,选择带字符串的变量而不使用case / when

时间:2014-04-02 11:32:32

标签: cucumber watir

我有一个像这样的黄瓜步骤(它不起作用,但它是一个概念):

And (/^I navigate to this url '(.*?)'$/) do |web|
   web = $ + 'web' + '_url'
   @browser.goto web
end

在另一个文件paths.rb中,我有这个硬编码的网址:

$google_url = http://www.google.com

我希望能够通过以下方式选择该网址:

And I navigate to this url 'google'

目前,我还没有找到一种方法来选择变量$ google_url的“真实内容”。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

解决方案 - 使用eval(糟糕的主意)

最快和最直接的解决方案是使用eval来执行字符串以获取变量。但是,通常建议eval是一个坏主意。

And (/^I navigate to this url '(.*?)'$/) do |web|
   url = eval('$' + web + '_url')
   @browser.goto url
end

解决方案 - 创建模块并使用发送

我认为更好的想法是创建一个包含所有路径常量的模块。这样做会更好,因为(1)您可以防止使用许多全局变量污染空间,(2)使用sendeval更安全。

在你的paths.rb中,你可以用一个可以返回不同网址的模块替换你的全局变量:

module Paths
    class << self
        def google_url()
            'http://www.google.com'
        end
    end
end

然后,您将在步骤中使用send将字符串转换为方法:

And (/^I navigate to this url '(.*?)'$/) do |web|
   url = Paths.send(web + '_url')
   @browser.goto url
end