Ruby on Rails Pundit的current_user在集成测试中是零

时间:2016-03-15 01:39:15

标签: ruby-on-rails-4 devise integration-testing pundit

我正在使用宝石multiple interfaces/properties definedpundit。我有一个删除链接,只有在你是管理员时才显示。我有一个集成测试,我想验证删除链接只显示给管理员。

devise

我的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,其值为current_user。这是我的nil

comment_policy.rb

作为结束语,我听说Rails 5选择了集成测试而不是控制器测试,因为我们从Rails 4中了解它们是为我们的控制器生成的默认测试类型。如果是这种情况,如果在控制器测试中使用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 / devise帮助程序,那么sign_in在使用Rails 5时会更加有用。也参与集成测试。但是,我仍然会遇到sign_out不知道pundit是什么的问题吗?我假设这一切在控制器测试中都能正常工作,因为current_user的范围是控制器?关于这个主题的任何和所有的亮点都非常受欢迎,但我真的想弄清楚如何让集成测试与这个设置一起工作,因为我现在有大约十亿我想写。

1 个答案:

答案 0 :(得分:1)

并非完全重要,但它是否需要在策略中使用current_user,或者只是在策略中使用用户。我的意思是根据Github上的elabs / pundit README,我只会使用@useruser而不是current_user。如果我困惑你,请阅读自述文件。

此外,nil current_user通常会在您的请求没有有效的CSRF令牌时发生。当您在网站上手动执行此操作时,请转到localhost:3000或w / e,首先在登录路径上执行get,然后使用您的凭据在登录路径上发布帖子。在您的集成测试中,我似乎没有看到您执行get的位置以获得会话的CSRF。

希望这有帮助!!!