Тестовые случаи для проверки страницы 500 и 404

Я пытаюсь пройти тесты для страниц 404 и 500. Но у меня много проблем

1) Во-первых, у меня есть страница 500.html.erb внутри app/views/errors/, которая не вызывается.
2) Если я запускаю приведенный ниже тест, моя система зависает, и мне нужно перезагрузить систему
3) Если я прокомментирую эту строку expect{get "/errors/foo"}.to raise_exception( ActionController::RoutingError). Таким образом, в моем контроллере имя действия page 500 передается как параметры, но моя система все равно зависает

Может ли кто-нибудь помочь мне решить эту проблему

errors_spec.rb

 require "spec_helper"

    describe "Errors" do

      before do
        allow(Rails).to receive(:env).and_return(ActiveSupport::StringInquirer.new("production"))
      end

      it "renders the 500 page" do
         get "/errors/500"
         expect(response.status).to eq(500)
      end

      it "renders the 404 page" do
        get "/errors/404"
        expect(response.status).to eq(404)
      end

      it "raises an exception if the page doesn't exist" do
        expect {get "/errors/foo"}.to raise_exception(ActionController::RoutingError)
      end
    end 

errors_controller.rb

class ErrorsController < ApplicationController
  skip_before_filter :authenticate_user!

  EXTERNAL_ERRORS = ['sso']
  VALID_ERRORS = ['404', '403', '500', 'maintenance'] + EXTERNAL_ERRORS

  def show
    status = external_error? ? 500 : 200
    render page , status: status
  end

  def blocked
  end

  private

  def page
    if VALID_ERRORS.include?(params[:id])
      params[:id]
    else
      raise(ActionController::RoutingError.new("/errors/#{params[:id]} not found"))
    end
  end

  def external_error?
    EXTERNAL_ERRORS.include?(params[:id])
  end
end

person ankur    schedule 13.12.2017    source источник
comment
Является ли это проблемой только для тестирования, то есть работает ли она, когда вы открываете URL-адреса в браузере?   -  person Stefan    schedule 13.12.2017
comment
Он отлично работает, когда я пытаюсь нажать из браузера   -  person ankur    schedule 13.12.2017
comment
Можете ли вы открыть какие-либо другие URL-адреса в своих тестах без зависания системы, т.е. является ли проблема специфичной для ErrorsController?   -  person Stefan    schedule 13.12.2017
comment
Да, я могу открыть другой URL-адрес в error_controller, кроме 404 и 500.   -  person ankur    schedule 13.12.2017
comment
@Stefan - Ты хоть представляешь, где я ошибаюсь?   -  person ankur    schedule 13.12.2017
comment
Нет, к сожалению нет. Я просто хотел исключить общую проблему с вашей тестовой настройкой.   -  person Stefan    schedule 13.12.2017


Ответы (1)


В вашем коде вы устанавливаете статус 200, когда вызывается /errors/500.

  def show
    # external_error? returns false.
    status = external_error? ? 500 : 200
    render page , status: status # Status is 200.
  end

Используйте отладчики, такие как pry или byebug, для проверки состояния. В вашем тестовом примере нет никаких проблем. Попробуй это.

class ErrorsController < ApplicationController
  skip_before_filter :authenticate_user!

  EXTERNAL_ERRORS = ['sso']
  VALID_ERRORS = ['404', '403', '500', 'maintenance'] + EXTERNAL_ERRORS

  def show
    status = error_500? ? 500 : 200
    render page , status: status
  end

  def blocked
  end

  private

  def page
    if VALID_ERRORS.include?(params[:id])
      params[:id]
    else
      raise(ActionController::RoutingError.new("/errors/#{params[:id]} not found"))
    end
  end

  def external_error?
    EXTERNAL_ERRORS.include?(params[:id])
  end

  def error_500?
    ['500'].include?(params[:id]) || external_error?
  end
end
person Omkar    schedule 20.12.2017