我正在使用Ruby 2.3.0
编写葫芦测试,而且我无法从模块中调用黄瓜方法。
module A
module_function
def visible
wait_for_elements_exist("Some element query")
end
end
并且:
Class B
include A
end
当我致电B.visible
或在B
中定义:
def visible
A::visible
end
并致电B.visible
,我得到NoMethodError
,表示模块A中的wait_for_elements_exist
。
我已经尝试了模块中的require 'calabash-cucumber/cucumber'
和模块中的include Calabash::Cucumber
。它没有用。
我可以从我项目中的其他类访问所有黄瓜方法,并且我已经在env.rb
中需要黄瓜,因此库已加载。我想知道如何从模块访问库函数,或者如何正确地将事物包含到我的模块中。
修改
我尝试了include Calabash::Cucumber::WaitHelpers
include Calabash::Cucumber::Operations
没用。我用extend替换了include,现在我可以访问这些方法,但这不能解决我的问题。
我需要的是
AndroidModule < Calabash::Android::Operations
IosModule < Calabash::Cucumber::Operations
在这些模块中,我定义了平台之间不同的方法。
然后有ScreenModule
用于各种屏幕,我在其中定义了特定于屏幕的方法,并且根据我启动的测试,我需要ScreenModule
来包含其中一个平台模块。
我需要::Operations
访问ScreenModule
,但它找不到任何这些方法。
我无法弄清楚,为什么我无法使用wait_for_elements_exist
,即使我已经包含::Operations
moudle
答案 0 :(得分:1)
简短的回答是,您没有在模块中包含正确的模块。
include Calabash::Cucumber::WaitHelpers
答案越长,取决于您要做的事情。由于您似乎对ruby不熟悉,我推荐这种方法:
# features/steps/my_steps.rb
module MyApp
module A
def visible(mark)
wait_for_element_exist("* marked:'mark'")
end
end
end
World(MyApp::A) # Add your module to the Cucumber World.
Then(/^I touch next$/) do
visible("Next")
touch("* marked:'Next'")
end
您可以在CalSmoke project中找到相关示例。
这是将模块加载到Cucumber中的方法。
根据您的评论,我看到您要使用页面对象模型(POM)。
我们在x-platform-example repo和Xamarin docs中提供了如何执行此操作的示例。
您需要了解ruby加载代码的方式与如何向Cucumber公开方法之间存在差异。
如果您不熟悉红宝石,我推荐这本书Metaprogramming in Ruby。如果您是Cucumber的新手,我推荐这些资源。