Тестирование ApplicationController Filters, Rails - PullRequest
5 голосов
/ 09 августа 2011

Я пытаюсь использовать rspec для проверки фильтра, который есть в моем ApplicationController.

В spec/controllers/application_controller_spec.rb У меня есть:

require 'spec_helper'
describe ApplicationController do
  it 'removes the flash after xhr requests' do      
      controller.stub!(:ajaxaction).and_return(flash[:notice]='FLASHNOTICE')
      controller.stub!(:regularaction).and_return()
      xhr :get, :ajaxaction
      flash[:notice].should == 'FLASHNOTICE'
      get :regularaction
      flash[:notice].should be_nil
  end
end

Мое намерение состояло в том, чтобы тест смоделировал действие ajax, которое устанавливает вспышку, а затем подтвердил при следующем запросе, что вспышка была очищена.

Я получаю ошибку маршрутизации:

 Failure/Error: xhr :get, :ajaxaction
 ActionController::RoutingError:
   No route matches {:controller=>"application", :action=>"ajaxaction"}

Тем не менее, я ожидаю, что с тем, как я пытаюсь это проверить, не так много вещей.

Для справки фильтр называется в ApplicationController как:

  after_filter :no_xhr_flashes

  def no_xhr_flashes
    flash.discard if request.xhr?
  end

Как я могу создать фиктивные методы на ApplicationController для проверки фильтра всего приложения?

1 Ответ

8 голосов
/ 20 октября 2011

Для тестирования контроллера приложения с использованием RSpec необходимо использовать Подход анонимного контроллера RSpec .

В основном вы настроили действие контроллера в файле application_controller_spec.rb, который затем могут использовать тесты.

Для вашего примера выше это может выглядеть примерно так.

require 'spec_helper'

describe ApplicationController do
  describe "#no_xhr_flashes" do
    controller do
      after_filter :no_xhr_flashes

      def ajaxaction
        render :nothing => true
      end
    end

    it 'removes the flash after xhr requests' do      
      controller.stub!(:ajaxaction).and_return(flash[:notice]='FLASHNOTICE')
      controller.stub!(:regularaction).and_return()
      xhr :get, :ajaxaction
      flash[:notice].should == 'FLASHNOTICE'
      get :regularaction
      flash[:notice].should be_nil
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...