Ваш код очень похож на мой - я пытался использовать функции Capybara и Devise TestHelper, и оказалось, что вы не можете, на https://github.com/plataformatec/devise/wiki/How-To:-Test-with-Capybara. Рекомендованный способ сделать это объяснен на этой страницеи это сработало для меня.
Для ясности, вот что я сделал - в spec_helper.rb
:
RSpec.configure do |config|
config.include Warden::Test::Helpers
end
Warden.test_mode!
А в моем коде просто - logout :user
.
Вот почему, согласно вики Devise, вы не можете использовать sign_out
:
Если вам интересно, почему мы не можем просто использовать встроенные в Devise методы sign_in и sign_outэто потому, что они требуют прямого доступа к объекту запроса, который недоступен при использовании Capybara.Чтобы объединить функциональность обоих методов вместе, вы можете создать вспомогательный метод.
Что примерно означает, что если, скажем, MiniTest
, объект, представляющий запрос (@request
), добавляется в качестве переменной экземпляра в класс тестового примера, который неслучилось с Капибарой.Я не смотрел на код, чтобы узнать подробности более точно, но в основном Warden ожидает найти этот объект, чтобы затем получить доступ к хранилищу cookie, где находятся учетные данные для входа.Я думаю, что с Capybara / RSpec этого не происходит.