在黄瓜中扩展模块

时间:2015-06-30 11:35:39

标签: ruby module cucumber capybara

我知道在Cucumber中我可以创建一个模块然后将该模块包含到World对象中,并且我在新创建的模块中创建的所有方法都是全局可用的

module MyModule
  def my_method

 end
end
World(MyModule)

现在我的黄瓜测试中的任何地方都可以拨打my_method并且它可以正常工作

我在这里看到的问题和我遇到的问题是方法名称的重复,因为应用程序变大或其他测试人员/开发人员在应用程序上工作。

所以,如果我要在自己的模块中包装所有内容并像这样创建module methods

module MyModule
  def self.my_method
    page.find('#element')
 end
end
World(MyModule)

MyModule.my_method
# This will return undefined variable or method 'page' for MyModule module

因此,对于使用模块的新手,我已经读过你可以extend其他模块,以便你可以在另一个模块中使用这些方法

因此,要访问page方法,我需要访问Capybara::DSL

 module MyModule
 extend Capybara::DSL
  def self.my_method
    page.find('#element')
 end
end
World(MyModule)

MyModule.my_method现在有效,但我的问题不是为我需要访问的每个模块扩展单个命名空间,是否有扩展/包含所有内容的方法,或者这是一种不好的做法?

事情失败的另一个例子是我尝试访问类的实例

module SiteCss
 def login_page
   Login.new
 end
end

class Login < SitePrism::Page
 element :username, "#username"
end

module MyModule
 extend Capybara::DSL
  def self.my_method
    page.find('#element')
   login_page.username.set('username')
 end
end
World(MyModule)

因此,如果我是这样的话,请尝试拨打login_page.username我会得到

undefined method `login_page`

我真的在寻找正确的方法。

总之,我试图了解如何在黄瓜中使用自定义模块和类,而无需将所有内容加载到World对象中。

1 个答案:

答案 0 :(得分:0)

是的,多次扩展模块并不是很好,如果这真的是你想做的事情,我可以建议一种方法来改善它:

基类将继承你的页面对象框架并扩展(包括可能是正确的选项):

module Pages
  class BasePage < SitePrism::Page
    extend Capybara::DSL
  end
end

现在登录类:

module Pages
  class Login < BasePage
    element :username, "#username"

    def yourmethod
      page.find('#element')
      username.set('username')
    end
  end
end

现在你可能感兴趣的部分,将你的方法暴露给黄瓜世界:

module SiteCss
  def page_object
    @page_object ||= Pages::Login.new
  end
end

World(SiteCss)

现在你应该以更清洁的方式访问你的方法......

用法:

@page_object.yourmethod

虽然我可以给你的最重要的建议是从SitePrism运行...创建你自己的页面对象框架...不要陷入SitePrism陷阱......