在 RailsTutorial.org test_helper 中包含 SessionsHelper:为什么不呢?

Including SessionsHelper in RailsTutorial.org test_helper: why not?

railstutorial.org, Listing 8.23中:

ENV['RAILS_ENV'] ||= 'test'
.
.
.
class ActiveSupport::TestCase
  fixtures :all

  # Returns true if a test user is logged in.
  def is_logged_in?
    !session[:user_id].nil?
  end
end

建议创建一个重复的方法来检查当前用户是否登录(已经在sessions_helper.rb中定义了这样的方法)用于测试。但是,我想知道为什么作者首先选择这样做。他这样解释他的推理:

To test the behavior from Listing 8.22, we can add a line to the test from Listing 7.26 to check that the user is logged in. It’s helpful in this context to define a is_logged_in? helper method to parallel the logged_in? helper defined in Listing 8.15, which returns true if there’s a user id in the (test) session and false otherwise (Listing 8.23). (Because helper methods aren’t available in tests, we can’t use the current_user as in Listing 8.15, but the session method is available, so we use that instead.) Here we use is_logged_in? instead of logged_in? so that the test helper and Sessions helper methods have different names, which prevents them from being mistaken for each other.

然而,在第 5 章的练习中,作者在其测试套件中编写了包含 ApplicationHelper 的代码(参见 Listing 5.37):

ENV['RAILS_ENV'] ||= 'test'
.
.
.
class ActiveSupport::TestCase
  fixtures :all
  include ApplicationHelper
  .
  .
  .
end

当我使用该辅助模块中的代码包含 SessionsHelper 和 运行 我的测试时,我的测试仍然通过了。我想知道作者是否选择放弃在代码中包含 SessionsHelper 是因为在练习中使用了该技术(因此最好在其他地方应用),或者如果实际上将 SessionsHelper 包含在测试套件中是一个错误出于某种原因的事情。对此有何见解?

读完第 8 章后,我发现使用 logged_in?(即 !current_user.nil?)中的代码测试用户是否登录在某种程度上无法用于测试,因此方法 current_user 实际上不起作用(即,不知何故它总是 returns true)。虽然我不知道为什么;我基于这句话:

(Because helper methods aren’t available in tests, we can’t use the current_user as in Listing 8.15, but the session method is available, so we use that instead.)

所以基本上在测试中使用 current_user 方法是行不通的,因为它在测试中不可用? (不过,我以为我将它们包含在 test_helper.rbinclude SessionsHelper 中。

这是我目前的回答。如果比我更有见识的人能证实这里面的工作原理,那就太好了。

编辑:好的,我认为这是因为 current_user 方法使用 @current_user ||= User.find_by(id: user_id)User 数据库在开发和测试之间是不同的。