从模块

时间:2016-04-05 07:49:45

标签: ruby cucumber calabash

我正在使用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

1 个答案:

答案 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 repoXamarin docs中提供了如何执行此操作的示例。

您需要了解ruby加载代码的方式与如何向Cucumber公开方法之间存在差异。

如果您不熟悉红宝石,我推荐这本书Metaprogramming in Ruby。如果您是Cucumber的新手,我推荐这些资源。