gem Warden,为什么我需要范围:在login_as helper中?

时间:2014-12-03 05:41:54

标签: ruby-on-rails ruby devise capybara warden

在查看其他人的代码后,我注意到以下内容:

login_as user, scope: :user

我一直用

login_as user

所以我出去寻找解释,并发现这篇文章How to: Test with Capybara表示使用scope: :user但没有任何解释。没有它我的所有测试都工作正常。

另一个奇怪的事情是Warden.test_mode!,我也没有使用它。我为什么需要它?

有任何解释吗?

2 个答案:

答案 0 :(得分:4)

<强> 1
正如您可以看到herelogin_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-datascope用于分隔已登录实体(例如:user和:admin)的会话数据。 Warden允许您与一个具有更多实体的会话同时登录。