gpt4 book ai didi

ruby-on-rails-4 - Ruby on Rails Pundit的current_user在集成测试中为零

转载 作者:行者123 更新时间:2023-12-04 07:02:37 25 4
gpt4 key购买 nike

我正在使用punditdevise gem 。我有一个删除链接,仅当您是管理员时才会显示。我有一个集成测试,我想验证删除链接仅对管理员显示。

test 'comment delete link shows when it should' do
log_in_as @admin
get movie_path(@movie)
assert_select 'a[href=?]', movie_comment_path(comments(:one), @movie.id)
end

我的 test_helper.rb看起来像这样:

...
class ActiveSupport::TestCase
...
def log_in_as(user, options = {})
password = options[:password] || 'password'
if integration_test?
post user_session_path, 'user[email]' => user.email, 'user[password]' => user.password
else
Devise::TestHelpers.sign_in user
end
end

private

# Returns true inside an integration test.
def integration_test?
defined?(post_via_redirect)
end

end
response.body看起来不错,但实际上没有删除链接。当我运行开发服务器并亲自访问该页面时,就会出现一个。我将其范围缩小为pundit在策略中使用的 current_user传递,其值为 nil。这是我的 comment_policy.rb:

class CommentPolicy
attr_reader :current_user, :comment

def initialize(current_user, model)
@current_user = current_user
@comment = model
end

def create?
if @current_user
@current_user.member? or @current_user.content_creator? or @current_user.moderator? or @current_user.admin?
end
end

def destroy?
if @current_user
@current_user == @comment.user or @current_user.moderator? or @current_user.admin?
end
end

end

作为结束语,我听说Rails 5选择了集成测试,而不是 Controller 测试,正如我们从Rails 4知道的那样,它是为 Controller 生成的默认测试类型。在这种情况下,如果使 Controller 测试中使用的 devise/ sign_in帮助程序也可以在集成测试中使用,那么在使用Rails 5时 sign_out会开箱即用。但是,我仍然会遇到不知道 pundit是什么的 current_user问题吗?我假设这一切在 Controller 测试中都能正常工作,因为 current_user的作用域是 Controller ?非常感谢您对此主题有任何了解,但是我真的很想弄清楚如何使集成测试与该设置一起使用,因为我现在有大约十亿个要写的东西。

最佳答案

这并不完全重要,但是它需要在策略中使用current_user还是可以仅在策略中使用user。我的意思是,根据Github上的elabs/pundit README,我将在各处都使用@useruser而不是current_user。如果我感到困惑,请阅读自述文件。

此外,当您对请求没有有效的CSRF token 时,通常会出现nilcurrent_user。当您通过转到localhost:3000或w/e在网站上手动执行此操作时,首先要在登录路径上执行get,然后再使用凭据在登录路径上进行发布。在您的集成测试中,我似乎看不到您在哪里执行get来获取 session 的CSRF。

希望这可以帮助!!!

关于ruby-on-rails-4 - Ruby on Rails Pundit的current_user在集成测试中为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36001198/

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