测试保持与Rspec签署

时间:2012-07-05 21:16:40

标签: ruby-on-rails session rspec

我有点难以为你所看到的“保持登录”功能写一些rspec测试(以及在哪里),包括google登录。

我在网上找到的例子没什么帮助。具体来说,我想测试这两种情况。

1

  • a)用户使用有效凭据登录而未点击“停留” 签到“
  • b)用户关闭浏览器,重新打开并请求保护页面。
  • 用户不应该看到受保护的页面。
  • 用户应该看到要求他们登录的页面。

2

  • a)用户使用有效凭据登录并点击“停留” 签到“
  • b)用户关闭浏览器,重新打开并请求受保护的页面。
  • 用户不应该看到要求他们登录的页面。
  • 应该将用户带到受保护的页面。

我首次尝试解决问题涉及通过删除存储在会话中的user_id来模拟浏览器关闭(因为它在浏览器关闭时被删除)。但是,这些测试失败了,因为我在请求规范文件夹中工作,并且无法访问会话变量。我之前的相关问题:session available in some rspec files and not others. how come?

使用rspec进行这些测试的最佳方法是什么?

3 个答案:

答案 0 :(得分:1)

这里有两个问题,我认为属于不同的测试:

  1. 用户在未登录时无法访问受保护的页面。这是控制器测试。
  2. 用户即使在会话被销毁后也会自动登录,只要在Cookie中设置了“remember”me标志。
  3. 对于#1,您可以尝试类似:

    describe UsersController do
      context "when not logged in" do
        context "GET users/edit" do
          it "redirects to login" do
            get :edit, :id => 123
            response.should redirect_to login_path
          end
        end
      end
    end
    

    您可以创建一个更通用的测试用例来断言未明确列出的所有操作,这样如果访问代码稍后变得更加宽松,则您没有测试间隙。但这是一个更微妙的观点。

    对于#2,您可以编写设置“记住我的标志”的请求规范,然后注销,然后再次登录并检查您是否到达了预期的页面。通过填写凭据,选中“记住我”框,单击按钮,从浏览器中驱动所有这些。

    问题是:为什么?你为什么想测试这个?您使用的是本土登录系统吗?非常沮丧,除非你是一位顶尖的安全专家。如果您没有使用自行开发的系统,而是使用经过测试的Devise,那么请不要重新测试库功能。只测试您的应用程序代码,例如对#1所涵盖的某些页面的访问权限。您还可以查看Devise附带的测试,了解他们如何测试这种情况。

    希望这有帮助。

    更新澄清#2的请求规范。正如@cutalion的另一个答案中提到的那样(他应该得到正确答案的肯定),验证登录可以在会话结束时保持不变的机制内置于open_session的ActionDispatch IntegrationTest框架中。

    请参阅Rails docs IntegrationTest API,其中包含示例。 blog post扩展使用自定义DSL。

答案 1 :(得分:1)

我认为您应该尝试使用标准轨道方法进行集成测试 - open_session 就个人而言,我从来没有这样做,也无法给你测试代码。

请参阅rails guides上的多个会话示例。

答案 2 :(得分:0)

这似乎在2018年仍然是经常性的问题。一些基本文档显然缺失。我终于找到了解决方案:“给我看饼干”。

切换Capybara驱动程序会清除会话,因此一种可能性是在测试过程中更改驱动程序以模拟浏览器的关闭/打开。但是,使备用驱动程序(例如selenium或selenium_chrome)起作用并不是一件容易的事,此外,此方法可能会删除 all cookie。

这个简单的命令也重置了会话:Capybara.reset_sessions!但是,问题再次在于它不仅破坏了会话cookie,而且破坏了永久cookie。因此,这对于测试“记住我”功能毫无用处。

我终于选择了Show me the cookies宝石。安装和实施非常简单。我只是按照rspec提供的说明进行操作。命令expire_cookies提供了令人满意的退出和打开浏览器的模拟。