如何设置可能具有子域的SitePrism :: Page的URL?

时间:2014-01-09 20:57:50

标签: capybara site-prism

我正在使用的基础架构最初以Site Prism documentation建议的方式处理网址:通过设置Capybara.app_host来处理域名,并且页面本身称为set_url,具有相对路径

事实证明,生产网站上的某些网页有一个子域名,例如members.mycompany.com而不是www.mycompany.com。测试还需要能够在完全具有不同域的测试环境中运行,并且在测试环境中根本没有子域,即使对于那些在生产站点中具有子域的页面也是如此。因此,不能将完整的URL放入每个SitePrism::Page

我认为最好的选择是完全停止使用Capybara.app_host,并创建一个使用环境状态(即:test:production)的URL构建器,页面的路径,以及指示页面是否是生产子域的一部分的标志。类似的东西:

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来生成完整的网址,而不需要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/loginMemberPage加载https://testmachine.localenvironment.com/mypage。如果环境为:production,我希望LoginPage加载https://www.mycompany.com/loginMemberPage加载https://members.mycompany.com/mypage

我相信我的get_url方法中的代码完成了我认为它应该做的事情,并且我也相信我创建的Environment对象的状态设置为页面'{{1之前的适当环境在测试中调用的方法。遗憾的是,当我尝试加载#load个对象时,SitePrism::Page获取的环境值始终是Environment对象的默认值(get_url)。因此,即使我正在尝试执行生产,它最终也会加载测试环境URL。

感觉就像在:test对象被实例化之前评估每个set_url对象的SitePrism::Page部分,我似乎无法找到一种方法来初始化环境发生在它之前。我是Ruby的新手,所以我希望我只是误解了这些东西正在加载的顺序或层次结构,并且不难纠正。任何人都可以确定我的尝试有什么问题,或者,如果有更好的方法来处理这种情况,请指出更好的方法是什么?

1 个答案:

答案 0 :(得分:2)

是的,正在定义类的set_url调用,换句话说,首次需要您的文件时。

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

请注意,SitePrism文档说只有在直接导航到页面时才需要set_url

  

请注意,设置网址是可选的 - 您只需要设置网址   您希望能够直接导航到该页面。这说得通   设置主页或登录页面的页面模型的URL,但是   可能不是搜索结果页面。

要验证您是否在页面上,可以使用正则表达式。有关在多种环境中运行的示例,请参阅https://github.com/natritmeyer/site_prism#verifying-that-a-particular-page-is-displayed