我有点难以为你所看到的“保持登录”功能写一些rspec测试(以及在哪里),包括google登录。
我在网上找到的例子没什么帮助。具体来说,我想测试这两种情况。
1
2
我首次尝试解决问题涉及通过删除存储在会话中的user_id来模拟浏览器关闭(因为它在浏览器关闭时被删除)。但是,这些测试失败了,因为我在请求规范文件夹中工作,并且无法访问会话变量。我之前的相关问题:session available in some rspec files and not others. how come?
使用rspec进行这些测试的最佳方法是什么?
答案 0 :(得分:1)
这里有两个问题,我认为属于不同的测试:
对于#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
提供了令人满意的退出和打开浏览器的模拟。