Тест контроллера для захвата несанкционированного ответа - PullRequest
0 голосов
/ 23 октября 2018

Я использую 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

1 Ответ

0 голосов
/ 23 октября 2018

ОБНОВЛЕНО: Третий тест не требуется, так как это логика представления, а не контроллер, а также оповещения должны работать как положено в рельсах.Однако вам просто нужно проверить, что вы перенаправлены так, как вы ожидаете.Попробуйте это:

require 'rails_helper'

describe CodesController, type: :controller do
  login_user

  describe "Get index" do
    subject { get :index }  

    it 'denies access to marketing user' do
      subject
      expect(response.status).to be == 302
    end

    it 'redirects user to home page' do
      expect(subject).to redirect_to(root_url)
    end

  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...