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!我也没有使用。我为什么需要它?
有什么解释吗?
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 的拆卸方法
这意味着如果你确定你不需要/使用任何由监狱长提供的帮助方法,不调用这个方法不会破坏你的测试。