2015-06-29 5 views
1

Я использую в моей application_controller: .consider_all_requests_local какТестирование с RSpec .consider_all_requests_local

unless Rails.application.config.consider_all_requests_local 
    rescue_from ActionController::InvalidCrossOriginRequest, :with => :render_404 
    end 

Это возвращение 404, если ActionController :: InvalidCrossOriginRequest приподнята. В местной среде это не поднимается, это хорошо для отладки. Для этой части он работает. Но я бы хотел проверить его с помощью rspec.

Я пытался что-то вроде

describe 'ActionController::InvalidCrossOriginRequest render 404' do 
    before { Rails.application.config.consider_all_requests_local = false } 
    controller do 
     def index 
     raise ActionController::InvalidCrossOriginRequest 
     end 
    end 

    subject { xhr :get, :index, format: :js } 

    its(:status) { is_expected.to eq 404 } 
end 

Две вещи. Я, вероятно, не поднимаю должным образом. Локально ошибка возникает, когда вызывается mywebsite.com/editor/fckeditor.js. Не удалось найти способ вызова определенного URL-адреса.

Вторая проблема, до не изменяет состояние Rails.application.config.consider_all_requests_local.

я получаю:

1) ApplicationController ActionController::InvalidCrossOriginRequest render 404 status 
    Failure/Error: raise ActionController::InvalidCrossOriginRequest 
    ActionController::InvalidCrossOriginRequest: 
     ActionController::InvalidCrossOriginRequest 

ответ

2

Этот вопрос выглядит быть вызвана ваша unless проверка выполняется во время загрузки класса. Это означает, что в первый раз, когда загружается класс, значение в конфигурации приложения проверяется, а rescue_from либо установлен, либо не установлен.

В самом основном обходном пути вам нужно будет использовать load, чтобы заставить этот файл перечитать после изменения настройки. Однако, как есть, как только rescue_from включен, загрузка файла снова не приведет к его отключению.

Следующая альтернатива - использовать rescue_from(with:), который делегирует помощнику или the block form. Вы можете использовать этот помощник, чтобы проверить значение и либо обработать условие, либо нет. Однако, учитывая, что это похоже на то, что вы только хотите сделать в непроизводственной среде, вы можете объединить эти два. Используйте unless, чтобы убедиться, что вы не в производстве, а затем используйте команду to, чтобы каждый раз проверять конфигурацию.

Что-то вроде:

class ApplicationController < ActionController::Base 
    unless Rails.env.production? 
    rescue_from ActionController::InvalidCrossOriginRequest do 
     unless Rails.application.config.consider_all_requests_local 
     render_404 
     end 
    end 
    end 
end 
+0

Спасибо @ aaron-k действительно отличный ответ. – Mio

1

Попробуйте насмешливый его вместо установки:

before { Rails.stub_chain('application.config.consider_all_requests_local').and_return(false) } 

Подробнее here

Этот синтаксис нежелателен, так что вы можете либо отключить предупреждение устаревания или использовать новое «обходное решение»

allow(object).to receive_message_chain(:one, :two, :three).and_return(:four) 
expect(object.one.two.three).to eq(:four) 

в публикуемую here

+0

Спасибо за ваш Anser Петр, но этот синтаксис нежелателен: 'Failure/ошибка: перед тем {. Rails.stub_chain ('application.config.consider_all_requests_local') and_return (ложь)} Использование 'stub_chain' из rspec-mocks '' синтаксиса': should' без явного включения синтаксиса устарело. Используйте новый синтаксис ': ожидать' или явно включите': should' вместо .' – Mio

Смежные вопросы