2013-01-11 63 views
0

试图做一个动态测试套件并重新使用函数定义。我有一个表单,您可以选择不同类型的联系方式,然后根据联系方式显示不同的页面。我试图做ruby​​动态函数调用

When /^I click the (.*) return type$/ do |response| 
    on_page(ContactUsPage).response unless @browser.url.include?("contactBy=#{response}") 

这除非网址包括“contactBy =”和响应类型(意味着你已经在页面上并没有链接会将当前响应的类型,并点击链接点击)

我有一个页面对象类(ContactUsPage),其具有不同的方法链接(电子邮件,电话,传真,邮政)

我遇到的问题是与ContactUsPage.response响应越来越注入进入浏览器检查,但它正在寻找ContactUsPage内的方法“响应”,而不是注入方法。

该方法应调用ContactUsPage.emailContactUsPage.faxContactUsPage.phone,具体取决于传递给函数的方法。

回答

1

您可以使用Ruby的send方法来调用动态的方法:

on_page(ContactUsPage).send(response) 

send的第一个参数是一个字符串或符号与要调用的方法名;任何更多的参数都传递给方法本身。

on_page(ContactUsPage).send("#{response}_element") 
# equivalent to `on_page(ContactUsPage).email_element` when response == "email" 
+0

可以:例如,如果你想调用变量名称(email_element或类似的),你只需要做一个快速的字符串插值开始的方法foo.send(:bar, "baz")相当于foo.bar("baz")

您在使用_element属性时使用此方法? on_page(ContactUsPage).send(response)_element.exists?.should be_true在(响应)“预计行结束”之后给我一个错误 –

+0

是的,那是无效的Ruby语法。 'send'需要你期望它调用的方法的全名。请参阅我编辑的答案,了解正确的方法。 –

+0

我不认为你理解_element部分。 _element是一个由页面对象给你的函数。例如:链接(:电子邮件,x)。如果你使用电子邮件,你会得到x的值,email_element返回页面中的元素 –