测试保持与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上的多个会话示例。
这里有两个问题,我认为属于不同的测试:
- 用户在未登录时无法访问受保护的页面。这是一个控制器测试。
- 即使在会话被销毁之后,用户也会自动登录,因此在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: everyday-rspec实操。第7章使用请求测试-测试API