在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
中定义了这样的方法)以用于测试。但是,我想知道为什么作者首先选择这样做。他解释了他的理由:
为了测试来自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
到测试套件中是不好的因某种原因或事。有什么见解吗?
答案 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)
数据库在开发和测试之间有所不同。