最初,我为我的应用程序设置了一个简单的自定义登录功能,该功能使用
session
,现在将其迁移为使用由 Rails 提供的 authentication
逻辑,该逻辑使用 cookies
创建登录会话。
这是我使用
session
登录用户的代码:
def create
if user = User.authenticate_by(user_params)
session[:user_id] = user.id
respond_to do |format|
...
end
else
..
end
end
这就是我在功能测试中为用户创建会话以使用
rack_session_access
gem 测试经过身份验证的视图的方法:
before do
page.set_rack_session(user_id: user.id)
visit new_sabeel_path
end
这曾经工作得非常好,并在迁移新的登录逻辑之前通过了所有测试。
这是我使用
cookies
登录用户的新/当前逻辑:
def create
if user ||= User.authenticate_by(user_params)
start_new_session_for user
respond_to do |format|
...
end
else
...
end
end
def start_new_session_for(user)
user.sessions.create!(user_agent: request.user_agent, ip_address: request.remote_ip).tap do |session|
Current.session = session
cookies.signed.permanent[:session_id] = {value: session.id, httponly: true, same_site: :lax}
end
end
进行这些更改后,测试现在失败,因为我们不再使用基于
session
的登录。
如果我无法像以前一样模仿登录逻辑,如何测试我的经过身份验证的视图?
预计 它应该在测试中正确设置 cookie,并能够访问经过身份验证的视图。
当前行为 在测试中,当访问经过身份验证的视图时,它会重定向回登录页面。
我尝试用谷歌搜索这个,但我得到的只是如何在控制器中进行测试,而不是功能测试。
我还尝试了一个名为
show_me_the_cookies
的库来在我的测试中创建 cookie,但它无法使用它登录,它会重定向到登录页面。
before do
create_cookie("session_id", session.id)
visit new_sabeel_path
end
我尝试在测试套件中使用
cookies
方法(就像我在登录逻辑中实现的那样)创建 cookie,但该方法不会由 Rails 自动加载。看起来它是 ActionController
模块的一部分。
这里有人使用过 Rails new
authentication
并在功能测试中测试了经过身份验证的视图吗?或者有人有使用 cookies
在功能测试中创建登录用户的经验吗?如果是,我很想听听您的解决方案!
谢谢! :)
仅供参考这些是我在测试环境中使用的依赖项:
group :development, :test do
gem "factory_bot_rails", "~> 6.4.0"
gem "rspec-rails", "~> 7.1.0"
end
group :test do
gem "capybara", "~> 3.40.0"
gem "rack_session_access"
gem "rails-controller-testing", "~> 1.0.5"
gem "selenium-webdriver", "~> 4.27.0"
gem "shoulda-callback-matchers", "~> 1.1.4"
gem "shoulda-matchers", "~> 6.4.0"
gem "simplecov", require: false
gem "show_me_the_cookies", "~> 6.0"
end
在我的应用程序的测试中我使用这样的东西
module ControllerMacros
def sign_in_user
before do
@current_user = create :user
@request.cookies[cookie_name] = value
end
end
def sign_in_admin
before do
@current_user = create :user, :admin
@request.cookies[cookie_name] = value
end
end
end
还有 Rails 助手
config.extend ControllerMacros, type: :controller
因此它允许为测试请求设置 cookie,然后在某些操作之前检查这些 cookie