2016-03-15 1 views
6

Я использую драгоценные камни pundit и devise. У меня есть ссылка удаления, которая отображается только в том случае, если вы являетесь администратором. У меня есть интеграционный тест, который я хотел бы проверить, что ссылка на удаление отображается только для администраторов.Ruby on Rails current_user Pundit равен нулю в тесте интеграции

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 был бы полезен из коробки при использовании Rails 5, если бы помощники , работающие в тестах контроллера, также работали в тестах интеграции. Но у меня все еще будет эта проблема pundit, не зная, что такое current_user? Я предполагаю, что все это прекрасно работает в тестах контроллера, потому что current_user привязан к контроллерам? Любые и все легкие пролить на эту тему очень ценится, но я бы очень хотел выяснить, как получить интеграционные тесты для работы с этой установкой, потому что у меня около миллиарда, которые я хочу написать прямо сейчас.

ответ

1

Не то, чтобы это было важно, но нужно ли использовать current_user в политике или просто использовать пользователя в политике. Под этим я подразумеваю, что в соответствии с elabs/pundit README на Github я бы использовал только @user и user везде, а не current_user. Прочитайте README, если я смутил вас.

Кроме того, nil для current_user обычно возникает, если у вас нет действительного токена CSRF для вашего запроса. Когда вы делаете это на веб-сайте вручную, перейдя на localhost:3000 или w/e, вы сначала выполняете get по пути входа в систему, прежде чем делать сообщение в пути входа с вашими учетными данными. В вашем тесте интеграции я, кажется, не вижу, где вы делаете это get, чтобы получить CSRF для вашей сессии.

Надеюсь, это поможет !!!

+0

большое спасибо, CSRF - это проблема с корнем для меня, теперь я хотя бы знаю, что исправить :) Хотя моя проблема не была связана с тестами, просто ошибка, которая время от времени происходит на действиях, которые обычно работают Что ж. –

 Смежные вопросы

  • Нет связанных вопросов^_^