我正在使用的基础设施最初按照Site Prism 文档建议的方式处理 URL:域是通过设置处理的Capybara.app_host
,并且页面本身set_url
使用相对路径调用。
事实证明,生产站点上的某些页面具有子域,例如members.mycompany.com
而不是www.mycompany.com
. 测试还需要能够完全在具有不同域的测试环境中运行,并且在测试环境中根本没有子域,即使对于那些在生产站点中确实具有子域的页面也是如此。因此,将完整的 URL 放入每个 URLSitePrism::Page
不是一种选择。
我认为最好的选择是Capybara.app_host
完全停止使用,并创建一个 URL 构建器,该构建器将使用环境状态(即:test
或:production
)、页面的相对路径以及指示页面是否属于生产子域。就像是:
def get_url(relative_path, subdomain_flag=false)
case Environment.get_environment
when :test
domain = "https://testmachine.localenvironment.com"
when :production
if subdomain_flag
domain = "https://members.mycompany.com"
else
domain = "https://www.mycompany.com"
end
end
return "#{domain}" + "#{relative_path}"
end
我曾希望我可以get_url
在每个SitePrism::Page
对象中使用来生成完整的 URL,而不需要Capybara.app_host
,如下所示:
class LoginPage < SitePrism::Page
set_url get_url("/login")
...
end
class MemberPage < SitePrism::Page
set_url get_url("/mypage", true)
...
end
如果环境是:test
,我希望LoginPage
加载https://testmachine.localenvironment.com/login
和MemberPage
加载https://testmachine.localenvironment.com/mypage
。如果环境是:production
,我希望LoginPage
加载https://www.mycompany.com/login
和MemberPage
加载https://members.mycompany.com/mypage
。
我相信我的方法中的代码做了我认为应该做的事情,而且我还相信我创建的 Environment 对象在测试中调用get_url
页面方法之前将其状态设置为适当的环境。#load
可悲的是,当我尝试加载我的SitePrism::Page
对象时,获取的环境值get_url
始终是 Environment 对象的默认值(即:test
)。结果,即使我尝试针对生产执行,它最终也会加载测试环境 URL。
感觉就像在实例化对象之前评估set_url
每个对象的一部分,我似乎无法找到一种方法来让我的环境初始化在它之前发生。我是 Ruby 的新手,所以我希望我只是误解了这些东西加载的顺序或层次结构,并且不难纠正。谁能确定我的尝试有什么问题,或者,如果有更好的方法来处理这种情况,请指出更好的方法是什么?SitePrism::Page
SitePrism::Page