Rails 项目中,经常要编写集成测试来检验网站是否按正确的流程运行,这样的测试通常与 Session 有关。如果不能深入理解 rails 测试的运行方式,往往会产生许多困惑。下面是我对这方面的理解,希望可以解惑。
class ActiveSupport::TestCase
)并没有运行全栈,sessions/ cookies hash 只保存在内存中,而不是 cookie jar 中。class ActionDispatch::IntegrationTest
)运行全栈—Rack middlewares, cookies, sessions。request 中的 sessions/ cookies 会经过 controller 保存到 cookie jar 中。session[:user_id] = user.id
, 因为 session hash 只是保存在内存中。session[:user_id] = user.id
这样的语句,并不能保存到 cookie jar. session[:user_id] = user.id
这样的语句。所以集成测试中不应出现直接修改 Session 的语句。应该按照软件实际运行方式,发送 HTTP request 改变 Session。如发送post login_path, params: { session: { ....} }
登陆用用户。
SessionsHelper 中有以下方法:
def log_in(user)
session[:user_id] = user_id
end
问:在 intergration test 中能不能使用 log_in 方法?
test_helper.rb
使用 include 语句调 helper 文件。解决方法:
post login_path, params: { session: { ....} }
,发送 request, 通过 controller 修改 session,实现 log in .class ActionDispatch::IntegrationTest
类加一个方法,用来实现通过 request 登陆。比如:class ActionDispatch::IntegrationTest
def log_in_as(user, password: "password")
post login_path, params: { session: { email: user.email, password: password } }
end
end
然后就可以在 intergration test 中调用 log_in_as, 使程序更简洁。