使用omniauth进行Rspec请求测试在调用注销时不会调用销毁方法

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

我有一个 Rails 6.1.7 项目,其中包含omniauth + devise 和我要连接的自定义 openid 连接服务器。 我正在尝试为注销功能编写一个 rspec 请求测试,并在 destroy 方法中使用一些逻辑,但由于某种原因它没有调用该逻辑。我不明白为什么。

路线.rb

devise_for :users, controllers: {
    sessions: 'users/sessions',
    passwords: 'users/passwords',
    confirmations: 'users/confirmations',
    omniauth_callbacks: 'users/omniauth_callbacks'
  }

设计.rb

config.sign_out_via = :get
config.omniauth :custom_openid_connect, {
...
}

sessions_controller.rb

module Users
  class SessionsController < Devise::SessionsController
    def create
      cookies['visited'] = '1'
      super
    end

    def destroy
      cookies.delete 'visited'
      super
    end

  end
end

omniauth_callbacks_controller.rb

module Users
  class OmniauthCallbacksController < Devise::OmniauthCallbacksController
    def custom
      @user = User.find(1)
      sign_in_and_redirect @user
    end
  end
end

sessions_spec.rb

require 'rails_helper'

RSpec.describe 'Users::Sessions', type: :request do
  include Devise::Test::IntegrationHelpers

  let!(:user) { FactoryBot.create(:user) }

  describe 'GET /users/sign_out' do
    before(:each) do
      cookies['visited'] = '1'
    end

    context 'log out success' do
      it 'should delete cookies' do
        get destroy_user_session_path(user)
        expect(response).to be_successful
        expect(cookies['visited']).to be_nil
      end
    end
  end
end

它未能预期 cookie 为零。为什么当我没有设置任何用户时,sign_out路由仍然返回成功?如果

destroy
中的
sessions_controller.rb
方法没有被调用,那么它调用的是哪个方法?

ruby-on-rails ruby devise omniauth
1个回答
0
投票

登录 当用户使用 OmniAuth 登录时,通常会创建一个会话来存储用户信息。 注销 调用销毁操作来清除会话,从而有效地注销用户。 为了使注销在您的测试中正常工作,您必须:

在测试销毁操作之前确保用户已登录。 在测试中正确模拟会话或 OmniAuth 状态。

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