如何在 Rails 中的 RSpec 功能测试中设置用户会话

问题描述 投票:0回答:1

最初,我为我的应用程序设置了一个简单的自定义登录功能,该功能使用

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

ruby-on-rails authentication cookies rspec-rails ruby-on-rails-8
1个回答
0
投票

在我的应用程序的测试中我使用这样的东西

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

© www.soinside.com 2019 - 2024. All rights reserved.