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

时间:2016-04-13 10:05:10

标签: ruby-on-rails ruby testing railstutorial.org helpers

railstutorial.orgListing 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中定义了这样的方法)以用于测试。但是,我想知道为什么作者首先选择这样做。他解释了他的理由:

  

为了测试来自Listing 8.22的行为,我们可以从Listing 7.26向测试添加一行来检查用户是否已登录。在此上下文中定义is_logged_in是有帮助的吗? helper方法与logged_in并行? Listing 8.15中定义的助手,如果(测试)会话中有用户ID则返回true,否则返回false(Listing 8.23)。 (因为辅助方法在测试中不可用,我们不能像Listing 8.15那样使用current_user,但会话方法可用,所以我们改用它。)这里我们使用is_logged_in?而不是logged_in?这样测试帮助器和Sessions帮助器方法就有了不同的名称,这可以防止它们彼此误认为。

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

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

当我包含SessionsHelper并使用该帮助程序模块中的代码运行我的测试时,我的测试仍然通过。我想知道作者是否选择在代码中放弃包括SessionsHelper,因为该技术在练习中使用(因此最好在其他地方应用)或者实际包括SessionsHelper到测试套件中是不好的因某种原因或事。有什么见解吗?

1 个答案:

答案 0 :(得分:0)

在完成第8章之后,我发现使用logged_in?中的代码(即!current_user.nil?)测试用户是否登录将无法以某种方式进行测试,因此方法{ {1}}实际上不起作用(即,它总是返回current_user)。虽然我不确切知道为什么;我的基础是这句话:

  

(因为辅助方法在测试中不可用,我们不能使用如清单8.15中的current_user,但会话方法可用,所以我们改用它。)

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

这是我现在的答案。如果比我更了解的人能证实这一点的内在运作,那就太好了。

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