我正在使用宝石multiple interfaces/properties defined
和pundit
。我有一个删除链接,只有在你是管理员时才显示。我有一个集成测试,我想验证删除链接只显示给管理员。
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
的范围是控制器?关于这个主题的任何和所有的亮点都非常受欢迎,但我真的想弄清楚如何让集成测试与这个设置一起工作,因为我现在有大约十亿我想写。
答案 0 :(得分:1)
并非完全重要,但它是否需要在策略中使用current_user,或者只是在策略中使用用户。我的意思是根据Github上的elabs / pundit README,我只会使用@user
和user
而不是current_user
。如果我困惑你,请阅读自述文件。
此外,nil
current_user
通常会在您的请求没有有效的CSRF令牌时发生。当您在网站上手动执行此操作时,请转到localhost:3000
或w / e,首先在登录路径上执行get
,然后使用您的凭据在登录路径上发布帖子。在您的集成测试中,我似乎没有看到您执行get
的位置以获得会话的CSRF。
希望这有帮助!!!