测试保持与Rspec签署

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了测试保持与Rspec签署相关的知识,希望对你有一定的参考价值。

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

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

1

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

2

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

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

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

答案

我认为你应该尝试标准的rails方法进行集成测试 - open_session。 我个人从来没有这样做过,也无法给你测试代码。

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

另一答案

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

  1. 用户在未登录时无法访问受保护的页面。这是一个控制器测试。
  2. 即使在会话被销毁之后,用户也会自动登录,因此在cookie中设置了“remember”me标志。

对于#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。

另一答案

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

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

此简单命令也会重置会话:Capybara.reset_sessions!但问题再次出现,它不仅会破坏会话cookie,还会破坏永久性cookie。所以它对测试“记住我”功能毫无用处。

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

以上是关于测试保持与Rspec签署的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Rspec 输出禁用 http 日志?

RSpec2 错误代码测试

Rspec: everyday-rspec实操。第7章使用请求测试-测试API

如何让 rspec-2 提供与测试失败相关的完整跟踪?

如何全局配置 RSpec 以保持打开“--color”和“--format specdoc”选项

如何测试 belongs_to 与 Rails 6 和 RSpec 4.1 的关联?