在 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.rb
行 include SessionsHelper
中。
这是我目前的回答。如果比我更有见识的人能证实这里面的工作原理,那就太好了。
编辑:好的,我认为这是因为 current_user
方法使用 @current_user ||= User.find_by(id: user_id)
但 User
数据库在开发和测试之间是不同的。
在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.rb
行 include SessionsHelper
中。
这是我目前的回答。如果比我更有见识的人能证实这里面的工作原理,那就太好了。
编辑:好的,我认为这是因为 current_user
方法使用 @current_user ||= User.find_by(id: user_id)
但 User
数据库在开发和测试之间是不同的。