Как установить локаль default_url_options для функциональных испытаний (направляющие)

В моем application_controller у меня есть следующий набор для включения локали со всеми путями, сгенерированными url_for:

  def default_url_options(options={})
    { :locale => I18n.locale }
  end

Мои маршруты ресурса затем имеют a: path_prefix = "/:locale"

Хорошо работает на сайте.

Но когда дело доходит до моих функциональных испытаний: локаль не передается со сгенерированными URL, и поэтому они все перестали работать. Я могу обойти его путем добавления локали к URL в моих тестах, как так:

  get :new, :locale => 'en'

Но я не хочу должным быть вручную добавлять локаль к каждому функциональному испытанию.

Я пытался добавить default_url_options определение выше к test_helper, но это, кажется, не имеет никакого эффекта.

Есть ли какой-либо способ, которым я могу изменить default_url_options для включения локали для всех моих тестов?

Спасибо.

12
задан Simone Carletti 5 January 2010 в 13:46
поделиться

3 ответа

Просмотр того, как тестовый регистр контроллера генерирует url, не кажется прямым способом использовать опции defualt_url_options. Основной блок, который фактически создает url (в тестах) выглядит следующим образом (http://github.com/rails/rails/blob/master/actionpack/lib/action_controller/test_case.rb):

private
  def build_request_uri(action, parameters)
    unless @request.env['REQUEST_URI']
      options = @controller.__send__(:rewrite_options, parameters)
      options.update(:only_path => true, :action => action)

      url = ActionController::UrlRewriter.new(@request, parameters)
      @request.request_uri = url.rewrite(options)
    end
  end

Он вызывается методом процесса, который, в свою очередь, вызывается методами get, post, head или put. Одним из способов получить то, что вы ищете, может быть использование метода alias_chain.

class ActionController::TestCase
  def process_with_default_locale(action, parameters = nil, session = nil, flash = nil, http_method = 'GET')
    parameters = {:locale=>'en'}.merge(parameters||{})
    process_without_default_locale(action, parameters, session, flash, http_method)
  end
  alias_method_chain :process, :default_locale
end

Вам захочется поместить это в ваш помощник теста, вне класса TestCase, я думаю. Дайте мне знать, как он работает, я его еще не тестировал, так что посмотрим.

2
ответ дан 2 December 2019 в 06:45
поделиться

При тестировании интеграции я обнаружил, что вышеуказанный патч обезьяны должен быть другим, это то, что у меня сработало (Rails 2.3.4):

class ActionController::Integration::Session
  def url_for_with_default_locale(options)
    options = { :locale => 'en' }.merge(options)
    url_for_without_default_locale(options)
  end
  alias_method_chain :url_for, :default_locale
end
0
ответ дан 2 December 2019 в 06:45
поделиться

Я столкнулся с этой проблемой из-за неудачного теста на огурец. Я использую локали в качестве параметров в URL-адресе, т.е. http://mysite.com/home?locale=he

Что я делаю, чтобы справиться с этим, так это удаляю все, что связано с локалью, из URL-адреса во время тестирования, определяя default_url_options в зависимости от среды, которую я использую:

  # app/controllers/application_controller.rb
  def default_url_options(options={})
    logger.debug "default_url_options is passed options: #{options.inspect}\n"
    ENV["RAILS_ENV"] != "cucumber" ? { :locale => I18n.locale } : {}
  end
1
ответ дан 2 December 2019 в 06:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: