gem Warden,为什么我需要 scope: in login_as helper?

fir*_*dev 3 ruby ruby-on-rails devise capybara warden

查看其他人的代码后,我注意到以下几点:

login_as user, scope: :user
Run Code Online (Sandbox Code Playgroud)

我一直简单地使用

login_as user
Run Code Online (Sandbox Code Playgroud)

所以我出去寻找解释并找到了这篇文章如何:用 Capybara 进行测试,上面写着使用scope: :user但是没有任何解释。没有它,我所有的测试都可以正常工作。

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

有什么解释吗?

Hoa*_*Hoa 6

1.
正如你可以看到这里login_as要求set_user用同一套选项。

这是(单击“查看源代码”)的源代码set_user。在第 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
Run Code Online (Sandbox Code Playgroud)

这意味着您的默认范围是:user在您login_as不传递范围的情况下调用时使用的范围。

2.
这里的文档Warden.test_mode!

。测试模式!? 目的

提供辅助方法以进行测试。

要在测试模式下设置监狱长,请调用 test_mode!看守的方法

这将提供多种方法。Warden.on_next_request(&blk) - 捕获一个块,该块在下一个请求 Warden.test_reset 时产生了 Warden 代理!- 删除本应在下一个请求中执行的任何捕获块

Warden.test_reset!应该在 rspec 的块之后调用,或者 Test::Unit 的拆卸方法

这意味着如果你确定你不需要/使用任何由监狱长提供的帮助方法,不调用这个方法不会破坏你的测试。