我有一个 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
方法没有被调用,那么它调用的是哪个方法?
登录 当用户使用 OmniAuth 登录时,通常会创建一个会话来存储用户信息。 注销 调用销毁操作来清除会话,从而有效地注销用户。 为了使注销在您的测试中正常工作,您必须:
在测试销毁操作之前确保用户已登录。 在测试中正确模拟会话或 OmniAuth 状态。