我正在使用寶石pundit
和devise
。我有一個刪除鏈接,只有當您是管理員時纔會顯示。我有一個集成測試,我想驗證刪除鏈接只顯示管理員。Ruby on Rails Pundit的current_user在集成測試中爲零
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
:
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選擇了集成測試,而不是控制器的測試,因爲我們知道他們從測試的默認類型的Rails 4的生成我們的控制器如果是這樣的話,devise
如果在控制器測試中工作的sign_in
/sign_out
助手也可以在集成測試中工作,那麼在使用Rails 5時可能會更加有用。但是,我仍然有這個問題pundit
不知道current_user
是什麼?我假設這一切都在控制器測試中正常工作,因爲current_user
被限制在控制器?任何和所有關於這個話題的燈光都非常感謝,但我真的很想弄清楚如何使用這個設置來進行集成測試,因爲我現在有大約10億的數據需要編寫。
非常感謝你,CSRF是我的一個根本問題,現在我至少知道該怎麼解決:)儘管我的問題與測試無關,只是不時發生的通常會發生的錯誤好。 –