В моем 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 для включения локали для всех моих тестов?
Спасибо.
Просмотр того, как тестовый регистр контроллера генерирует 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, я думаю. Дайте мне знать, как он работает, я его еще не тестировал, так что посмотрим.
При тестировании интеграции я обнаружил, что вышеуказанный патч обезьяны должен быть другим, это то, что у меня сработало (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
Я столкнулся с этой проблемой из-за неудачного теста на огурец. Я использую локали в качестве параметров в 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