在查看其他人的代码后,我注意到以下内容:
login_as user, scope: :user
我一直用
login_as user
所以我出去寻找解释,并发现这篇文章How to: Test with Capybara表示使用scope: :user
但没有任何解释。没有它我的所有测试都工作正常。
另一个奇怪的事情是Warden.test_mode!
,我也没有使用它。我为什么需要它?
有任何解释吗?
答案 0 :(得分:4)
<强> 1 强>
正如您可以看到here,login_as
使用相同的选项集调用set_user
。
以下是set_user
的{{3}}(点击“查看来源”)。在第165行,您将看到如果:scope
选项为空,则将使用默认范围。在您的Rails应用程序中,打开config/initializers/devise.rb
,您将找到如下内容
# Configure the default scope given to Warden. By default it's the first
# devise role declared in your routes (usually :user).
# config.default_scope = :user
这意味着您的默认范围是:user
,当您在不传递范围的情况下调用login_as
时,会使用该范围。
<强> 2 强>
这是Warden.test_mode!
.test_mode! ⇒对象
提供帮助方法以保证测试。
要在测试模式下设置warden,请调用test_mode!监狱长的方法
这将提供许多方法。 Warden.on_next_request(&amp; blk) - 捕获在下一个请求中产生warden代理的块 Warden.test_reset! - 删除任何已捕获的块 在下一个请求上执行
Warden.test_reset!应该在rspec的块之后调用,或者 Test :: Unit
的拆解方法
这意味着如果您确定不需要/使用warden提供的任何帮助方法,那么不调用此方法不会破坏您的测试。
答案 1 :(得分:1)
这可能很有帮助https://github.com/wardencommunity/warden/wiki/authenticated-session-data。
scope
用于分隔已登录实体(例如:user和:admin)的会话数据。
Warden允许您与一个具有更多实体的会话同时登录。