У меня возникла странная проблема, когда я создаю пользователя для теста Rspec/Capybara, и пользователь таинственно удален после входа в систему. Когда я запускаю свой тест, пользователь создается и успешно вошел в систему. Однако, когда Capybara посещает admin_categories_path
, тест терпит неудачу. Rails вызывает исключение, потому что current_user
не определен. Когда я вставляю binding.pry
, я вижу, что пользователь существует до тех пор, пока он не войдет в систему, и в этот момент пользователь исчезнет из тестовой базы данных, в результате чего current_user
будет неопределенным и тем самым инициирует исключение. Я не понимаю, как это происходит.Rspec/Capybara: Уберите пользователя «исчезает» после входа в систему
ОБНОВЛЕНИЕ: У меня проблема с удалением пользователя. Теперь, когда Capybara видит страницу admin_categories_path
, category
не отображается. Вставка binding.pry
показывает, что категория присутствует в базе данных.
Когда я запускаю приложение и регистрируюсь вручную, у меня нет проблем с доступом к admin_categories_path
.
Вот мой спецификации файла:
require 'rails_helper'
feature 'admin edits category', %Q{
As an admin, I want to edit a category or subcategory, so that it better
represents the content under it.
Acceptance Criteria:
* [X] - I can edit the name of a category inline.
* [X] - I can edit the name of a subcategory inline.
} do
let(:admin) do
FactoryGirl.create(:user, admin: true)
end
let(:category) do
FactoryGirl.create(:category)
end
scenario 'admin edits category title', js: true, focus: true do
login_as(admin)
visit admin_categories_path
bip_area category, :name, 'Test Category'
expect(page).to have_content 'Test Category'
end
end
Вот мой помощник файл authentication.rd
:
module Helpers
module Authentication
def log_in_as(user)
visit new_user_session_path
within "#new_user" do
fill_in 'user[email]', with: user.email
fill_in 'user[password]', with: user.password
click_on "Log in"
end
end
end
RSpec.configure do |config|
config.include Authentication, :type => :feature
end
end
Вот мой user
завод:
require 'factory_girl'
FactoryGirl.define do
factory :user do
sequence(:email) {|n| "lafiel.abriel#{n}@abhnation.com" }
username
password 'password'
password_confirmation 'password'
end
factory :category do
sequence(:name) { |n| "Category ##{n}" }
parent_id nil
display_index 1
user
end
sequence :username do |n|
"Lafiel_Abriel_#{n}"
end
end
А вот мой application_controller.rd
где инициируется исключение:
module Admin
class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?
before_action :reject_unless_admin
layout 'admin/layouts/application'
protect_from_forgery with: :exception
helper :avatar, :devise, :admin
protected
def reject_unless_admin
unless current_user && current_user.admin?
raise ActionController::RoutingError.new('404: Not Found')
end
end
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) << [
:avatar,
:remote_avatar_url,
:email,
:username,
:first_name,
:last_name,
:age,
:website,
:password,
:password_confirmation,
:current_password
]
end
end
end
Любая помощь/понимание очень ценится. Благодарю.
У меня возникла такая же проблема, когда current_user не присутствовал после успешного входа в систему. Самое страшное в том, что это происходит только в некоторых тестах: особенно, когда куча работает корректно, то внезапно последний тест не удается с этим поведением. В любом случае, было бы здорово, если бы вы могли поделиться, если и как вы решили свою проблему! Благодарю. –
Проверьте мой ответ ниже. Надеюсь, что это поможет! – ACIDSTEALTH