Тестирование ApplicationController before_filter в Rails - PullRequest
4 голосов
/ 21 сентября 2010

У меня есть приложение, которое обнаруживает поддомен по запросу и устанавливает результат в переменную.

, например

before_filter :get_trust_from_subdomain

def get_trust_from_subdomain
  @selected_trust = "test"
end

Как я могу проверить это с помощью Test :: Unit / Shoulda? Я не вижу способа попасть в ApplicationController и посмотреть, что установлено ...

Ответы [ 3 ]

1 голос
/ 21 сентября 2010

Метод assigns должен позволять запрашивать значение @selected_trust.Чтобы утверждать, что его значение равно «test» следующим образом:

assert_equal 'test', assigns('selected_trust')

При наличии контроллера foo_controller.rb

class FooController < ApplicationController
  before_filter :get_trust_from_subdomain

  def get_trust_from_subdomain
    @selected_trust = "test"
  end

  def index
    render :text => 'Hello world'
  end
end

можно написать функциональный тест следующим образом в foo_controller_test.rb:

class FooControllerTest < ActionController::TestCase
  def test_index
    get :index
    assert @response.body.include?('Hello world')
    assert_equal 'test', assigns('selected_trust')
  end
end

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

class ApplicationController < ActionController::Base
  before_filter :get_trust_from_subdomain

  def get_trust_from_subdomain
    @selected_trust = "test"
  end
end

class FooController < ApplicationController
  # get_trust_from_subdomain filter will run before this action.
  def index
    render :text => 'Hello world'
  end
end
0 голосов
/ 21 сентября 2010

Я выбрал это в другом контроллере в приложении:

require 'test_helper'

class HomeControllerTest < ActionController::TestCase

  fast_context 'a GET to :index' do
    setup do
      Factory :trust
      get :index
    end
    should respond_with :success

    should 'set the trust correctly' do
      assert_equal 'test', assigns(:selected_trust)
    end
  end

end
0 голосов
/ 21 сентября 2010

ApplicationController является глобальным, вы рассматривали возможность написания Rack Middleware вместо этого? Способ проще тестировать.

...