我知道在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对象中。
答案 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陷阱......