gpt4 book ai didi

ruby-on-rails - 无法在 sign_out 方法的功能测试中销毁 current_user

转载 作者:行者123 更新时间:2023-11-28 20:44:34 25 4
gpt4 key购买 nike

我想用这个测试来测试登录/注销方法:

test/controllers/sessions_controller_test.rb

class SessionsControllerTest < ActionController::TestCase
fixtures :users
include SessionsHelper

test "should signin and signout" do
get :new
assert_response :success
post :create, email: users(:alex).email, password: 'qwerty'
assert_redirected_to profile_url
assert cookies[:remember_token]
assert current_user == users(:alex), 'Ooops! Wrong current_user!'

delete :destroy
assert_redirected_to signin_url
debugger
assert !cookies[:remember_token]
=> assert !current_user, 'Ooops! Current_user not nil!'
end
end

=>cookies[:remember_token]没有了,但是current_user还是users(:alex),我不明白为什么。我错过了 delete :destroy 行吗?
集成测试正在通过,并且在浏览器中使用注销行为进行实时性能也可以达到目的。

来自 session Controller 和助手的方法:

sessions_controller.rb

def destroy
sign_out
redirect_to signin_url
end

sessions_helper.rb

def current_user=(user)
@current_user = user
end

def current_user
remember_token = User.encrypt(cookies[:remember_token])
@current_user ||= User.find_by(remember_token: remember_token)
end

def sign_out
cookies.delete(:remember_token)
self.current_user = nil
end

最佳答案

我对 Rails 的熟悉程度不如 Sinatra,但是 SessionsHelper 是否应该已经通过 Controller 中的 helpers 方法包含在内?

直接在测试中包含 SessionsHelper 模块意味着您现在有两个类,它们具有 @current_user 和相关方法 - Controller 类和测试类。

因此 Controller 路由上的 destroy 方法处理它的副本,而测试得到它自己的(它通过共享的 cookie 值方便地从数据库填充)。 Controller 的 destroy 方法不会改变测试对象中的实例变量。

测试可能不应该直接对 current_user 值进行断言,而是依赖于它可以从 Web 服务器响应中提取的数据。你不应该在这个测试中包含 include SessionsHelper(在 helper 的单元测试中它会没问题)。

关于ruby-on-rails - 无法在 sign_out 方法的功能测试中销毁 current_user,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18431237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com