На самом деле я пишу некоторые тесты, используя Rspec, для приложения Rails, использующего Devise.Я следовал руководству по нескольким моделям и все работает нормально, но в моих тестах правила перенаправления не реализованы правильно.
Так что в моем контроллере у меня есть это:
class CoachesController < ApplicationController
protect_from_forgery except: :update
before_action :authenticate_coach!, except: [:index, :show]
before_action :authenticate_athlete!, only: [:index, :show]
before_action :set_coach, except: :index
def index
if current_athlete and current_athlete.coach_id.present?
redirect_to booking_coach_path(current_athlete.coach_id)
else
@coaches = Coach.all
end
end
# ...
end
Доступ к индексу тренеров # в сеансе тренера должен перенаправить на authenticated_coach_root_path
, и вместо этого во время моего теста перенаправление на athlete_session_new
... Я думаю, это может быть связано с concern
:
module Accessible
extend ActiveSupport::Concern
included do
before_action :check_user
end
protected
def check_user
if current_coach
flash.clear
redirect_to(authenticated_coach_root_path) && return
elsif current_athlete
flash.clear
redirect_to(authenticated_athlete_root_path) && return
end
end
end
Вот мой тест:
require 'rails_helper'
RSpec.describe CoachesController, type: :controller do
describe 'GET #index' do
context 'when athlete is logged in' do
let(:coach) { build_stubbed(:coach) }
login_athlete
it 'redirects to coach booking url if has an associated coach' do
subject.current_athlete.coach_id = coach.id
get :index
is_expected.to redirect_to(booking_coach_path(subject.current_athlete.coach_id))
end
it 'renders index template if has no associated coach' do
get :index
is_expected.to render_template(:index)
end
end
context 'when coach is logged in' do
login_coach
it 'redirects to coach dashboard url' do
get :index
is_expected.to redirect_to(authenticated_coach_root_path)
end
end
end
end
Может быть, я должен что-то добавить в свою конфигурацию Rspec, чтобы позаботиться об этом?
Заранее спасибо за помощь!