1

我对如何(以及在​​哪里)为您看到的“保持登录”功能编写一些 rspec 测试感到有些困惑,包括在谷歌登录时。

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

1

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

2

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

我第一次尝试解决这个问题涉及通过删除我存储在会话中的 user_id 来模拟浏览器关闭(因为它在浏览器关闭时被删除)。但是,这些测试失败了,因为我在请求规范文件夹中工作并且无法访问会话变量。我之前的相关问题:会话在某些 rspec 文件中可用,而在其他文件中不可用。怎么会?

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

4

3 回答 3

1

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

  1. 用户未登录时无法访问受保护的页面。这是控制器测试。
  2. 即使会话被销毁,用户也会自动登录,只要在 cookie 中设置了“记住”我的标志。

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

问题是:为什么?你为什么要测试这个?您使用的是国产登录系统吗?除非您是一流的安全专家,否则非常气馁。如果您没有使用自制系统,而是使用经过测试的设计,则不要重新测试库功能。只需测试您的应用程序代码,例如#1 涵盖的某些页面的访问权限。您还可以查看 Devise 随附的测试如何测试这种情况。

希望这可以帮助。

更新以澄清 #2 的请求规范。正如@cutalion 的另一个答案中所提到的(他的正确答案值得称赞),用于验证登录是否可以在会话关闭期间持续存在的机制内置于 ActionDispatch IntegrationTest 框架中open_session

请参阅包含示例的Rails 文档 IntegrationTest API 。一篇博客文章扩展了自定义 DSL 的使用。

于 2012-07-05T22:02:18.360 回答
1

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

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

于 2012-07-05T22:09:34.397 回答
0

这似乎仍然是 2018 年反复出现的问题。一些基本文档显然缺失。我终于找到了一个解决方案:“给我看饼干”宝石。

切换 Capybara 驱动程序会清除会话,因此一种可能性是在测试中间更改驱动程序以模拟浏览器关闭/打开。但是让替代驱动程序(例如 selenium 或 selenium_chrome)工作并非易事,此外这种方法可能会删除所有cookie。

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

我终于决定给我看饼干宝石。安装和实施非常简单。我只是按照提供的 rspec 说明进行操作。该命令expire_cookies提供了令人满意的退出和打开浏览器的模拟。

于 2018-08-31T18:08:08.110 回答