Проверка того, вошел ли пользователь Devise в макет приложения

Я пытаюсь использовать файл application.html.erb для создания панели навигации на всех моих страницах. Я хочу, чтобы некоторые ссылки отображались только в том случае, если пользователь вошел в систему, а некоторые отображались, если пользователь не вошел в систему, поэтому в views/layouts/application.html.erb у меня есть следующее:

...
<% if user_signed_in? %>
    # Show some links
<% end %>

<% if not user_signed_in? %>
    # Show some other links
<% end %>
...

Это работает, когда я захожу на сайт, но проблема возникает, когда я пытаюсь протестировать грабли.

Когда я запускаю свои тесты, я получаю следующую ошибку:

AppointmentsControllerTest#test_should_get_index: ActionView::Template::Error: Devise не удалось найти экземпляр Warden::Proxy в среде вашего запроса. Убедитесь, что ваше приложение загружает Devise и Warden, как и ожидалось, и что промежуточное ПО Warden::Manager присутствует в вашем стеке промежуточного ПО. Если вы видите это в одном из своих тестов, убедитесь, что ваши тесты либо выполняют стек промежуточного программного обеспечения Rails, либо ваши тесты используют модуль Devise::Test::ControllerHelpers для внедрения объекта request.env['warden'] вместо вас.

Все подобные ошибки, которые я нашел в Интернете, похоже, не относятся к этой ситуации. Я понимаю, что во время тестирования Devise не загружается, но не могу понять, как это исправить. Я пробовал много разных вещей, и ничего не получалось.

Любая помощь приветствуется. Спасибо!


person dcod    schedule 31.10.2016    source источник
comment
Возможный дубликат: stackoverflow.com/ вопросы/38421853/   -  person Jordan Owens    schedule 01.11.2016
comment
Я не использую RSpec, поэтому это решение не работает.   -  person dcod    schedule 01.11.2016
comment
Это правда, я действительно думаю, что проблема в основном та же самая. Я добавил ответ ниже, который должен работать для модульных тестов.   -  person Jordan Owens    schedule 01.11.2016


Ответы (2)


если вы используете Devise? попробовать использовать current_user.present? не user_signed_in

<% if current_user.present? %>
  <%= some links %>
<%else%>
  <%= some links %>
<% end %> 

и в вашем ApplicationController добавьте это

    protect_from_forgery with: :exception
    before_action :configure_permitted_parameters, if: :devise_controller?
person Deez Nuuts    schedule 01.11.2016

Я думаю, вам нужно включить тестовые помощники Devise:

class AppointmentsControllerTest < ActionController::TestCase
  include Devise::Test::ControllerHelpers
end

См.: https://github.com/plataformatec/devise#controller-tests.

person Jordan Owens    schedule 01.11.2016