0

我正在使用的基础设施最初按照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/loginMemberPage加载https://testmachine.localenvironment.com/mypage。如果环境是:production,我希望LoginPage加载https://www.mycompany.com/loginMemberPage加载https://members.mycompany.com/mypage

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

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

4

1 回答 1

2

是的,这些set_url调用是在定义类时评估的,换句话说,当你的文件第一次被需要时。

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

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

请注意,设置 URL 是可选的 - 如果您希望能够直接导航到该页面,您只需要设置一个 url。为主页或登录页面的页面模型设置 URL 是有意义的,但可能不是搜索结果页面。

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

于 2014-01-11T02:07:24.327 回答