Capybara 如何设置可能有子域的SitePrism::页面的URL?

Capybara 如何设置可能有子域的SitePrism::页面的URL?,capybara,site-prism,Capybara,Site Prism,我正在使用的基础设施最初是按照建议的方式处理url的:域是通过设置Capybara.app\u host来处理的,页面本身称为set\u url,具有相对路径 事实证明,生产站点上的某些页面有一个子域,比如members.mycompany.com,而不是www.mycompany.com。测试还需要能够完全在具有不同域的测试环境中运行,并且在测试环境中根本没有子域,即使对于那些在生产站点中有子域的页面也是如此。因此,将完整的URL放入每个站点prism::Page不是一个选项 我认为最好的选择

我正在使用的基础设施最初是按照建议的方式处理url的:域是通过设置
Capybara.app\u host
来处理的,页面本身称为
set\u url
,具有相对路径

事实证明,生产站点上的某些页面有一个子域,比如
members.mycompany.com
,而不是
www.mycompany.com
。测试还需要能够完全在具有不同域的测试环境中运行,并且在测试环境中根本没有子域,即使对于那些在生产站点中有子域的页面也是如此。因此,将完整的URL放入每个
站点prism::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
我曾希望我可以在我的每个
SitePrism::Page
对象中使用
get\u url
来生成完整的url,而不需要
Capybara.app\u host
,如下所示:

class LoginPage < SitePrism::Page
   set_url get_url("/login")
   ...
end

class MemberPage < SitePrism::Page
   set_url get_url("/mypage", true)
   ...
end
class LoginPage
如果环境是
: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

我相信我的
get\u url
方法中的代码做了我认为它应该做的事情,而且我还相信我创建的环境对象在测试中调用页面的
\load
方法之前将其状态设置为正确的环境。遗憾的是,当我尝试加载我的
SitePrism::Page
对象时,
get\u url
获取的环境值始终是环境对象的默认值(即
:test
)。结果,即使我试图针对生产环境执行,它也会加载测试环境URL


这感觉就像是在实例化
SitePrism::Page
对象之前,对每个
SitePrism::Page
对象的
set\u url
部分进行了评估,我似乎找不到一种方法在初始化之前对环境进行初始化。我是Ruby新手,所以我希望我只是误解了这些东西加载的顺序或层次结构,并且不难纠正。有人能指出我的尝试有什么问题吗?或者,如果有更好的方法来处理这种情况,请告诉我更好的方法是什么?

是的,这些
set\u url
调用是在定义类时进行评估的,换句话说,是在首次需要文件时进行评估的

简单的解决方案是确保在需要页面对象之前初始化
环境
配置

请注意,SitePrism文档指出,只有在直接导航到页面时才需要
set\u url

请注意,设置URL是可选的-您只需要在以下情况下设置URL 您希望能够直接导航到该页面。这是有道理的 为主页或登录页的页面模型设置URL,但 可能不是搜索结果页面


为了验证您是否在页面上,可以改用正则表达式。有关在多个环境中运行的示例,请参阅。

谢谢。为了让事情更具动态性,我最后编写了一个小的
page\u启动器
对象,以便动态地将正确的域与相对URL组合在一起。现在工作得很好。