Я использую Rspec для проверки поведения контроллера.Когда пользователь посещает неавторизованную страницу, он перенаправляется на root_url и передает сообщение «Вы не авторизованы», как указано в моем блоке спасения cancan (gem):
rescue_from CanCan::AccessDenied do |exception|
redirect_to root_url, alert: exception.message
end
Теперь я хочу проверить, что ониперенаправлены на root_url, и ответ содержит сообщение «Вы не авторизованы для доступа к этой странице».Однако тесты не пройдены:
expected: "http://test.host/"
got: "http://test.host/users/sign_in"
И другой сбой:
expected "<html><body>You are being <a href=\"http://test.host/users/sign_in\">redirected</a>.</body></html>" to include "You are not authorized to access this page."
Это спецификации:
require 'rails_helper'
describe CodesController, type: :controller do
login_user
describe "Get index" do
it 'denies access to marketing user' do
get :index
expect(response.status).to be == 302
end
it 'redirects user to home page' do
get :index
expect(response.location).to eq(root_url)
end
it 'alerts user of unauthorized access' do
get :index
expect(response.body).to include('You are not authorized to access this page.')
end
end
end
Первый тест пройден.Вторые два провалились.Тем не менее, когда я захожу на сайт в качестве маркетингового пользователя, он не перенаправляет меня на страницу входа.Это идет к root_path как показано блоком CanCan.Что я не понимаю об объекте ответа в тестах Rspec?
Вот откуда взялся login_user:
module ControllerMacros
def login_user
before :example do
@request.env["devise.mapping"] = Devise.mappings[:user]
marketing = create :marketing
sign_in marketing
end
end
end
rails_helper.rb:
config.extend ControllerMacros, type: :controller
Iиспользую:
rspec-rails 3.8.0
devise 4.5.0
rails 4.2.10