Ruby on rails 什么';这是在ruby siteprism中重用步骤定义的最佳方法

Ruby on rails 什么';这是在ruby siteprism中重用步骤定义的最佳方法,ruby-on-rails,ruby,cucumber,capybara,site-prism,Ruby On Rails,Ruby,Cucumber,Capybara,Site Prism,我在尝试使用siteprism创建可重用的步骤定义时遇到了一些问题 假设特征文件是 Given that im on the site Then i should see a "stack over" text And i should see a "ask" text And i should see a "question" text 然后在我的步骤定义将是 我希望arg1是动态的,这个逻辑将检查它是否为真 Then (/^i should see a "(.*?)" text$/) do

我在尝试使用siteprism创建可重用的步骤定义时遇到了一些问题 假设特征文件是

Given that im on the site
Then i should see a "stack over" text
And i should see a "ask" text
And i should see a "question" text
然后在我的步骤定义将是

我希望arg1是动态的,这个逻辑将检查它是否为真

Then (/^i should see a "(.*?)" text$/) do |arg1|
@common_page = CommonLib.new
@ref = arg1.gsub(/\s+/,'')
expect(@common_page.*@ref*.text).to eq (arg1)
end
那么在我的页面上,def将是

class CommonLib < siteprism::page

element :stackover, "#text_header"
element :ask, "#text_ask"
element :question, "#text_question"
class CommonLib
我遇到的问题是:expect(@common_page.@ref.text)。到eq(arg1)

映射是错误的@ref需要使用它得到的数据,如“stackover”、“ask”和“question”,并在CommonLib页面def

调用#文本中映射,使用
eq
匹配器通常是一个坏主意,因为它绕过了水豚内置的重试行为,并且可能会在动态变化的页面上导致不稳定的测试。相反,您应该使用have_text或:text选项传递给查找程序

expect(@common_page.send(@ref)).to have_text(arg1)

还有,你为什么要使用@common_page和@ref实例变量,它们似乎只是在测试结束时超出范围的常规变量。

调用#文本并使用
eq
匹配器通常是一个坏主意,因为它绕过了水豚内置的重试行为,并可能导致在动态更改页面上进行不稳定的测试。相反,您应该使用have_text或:text选项传递给查找程序

expect(@common_page.send(@ref)).to have_text(arg1)


另外,您之所以使用@common_page和@ref实例变量,是因为它们看起来应该是常规变量,在测试结束时超出了范围。

这一点的全部意义是,您可以在不同的功能文件中重复使用步骤定义。我没有尝试过,但我认为您可以使用'send'作为:expect(@common_page.send(@ref.text).到eq arg1.我已经试过了,但它没有起作用,它说的是“undefined stackover”。这一个的全部要点是,你可以在不同的功能文件中重复使用你的step def.我没有试过,但我认为你可以使用'send'作为:expect(@common_page.send(@ref.text).到eq arg1.我试过了,但它没有起作用“undefined stackover”感谢您的回复。我已经测试了它们,它们都很好。我将尝试删除所有的.text和eq并更改它们。谢谢您的回复。我已经测试了它们,它们都很好。我将尝试删除所有的.text和eq并更改它们