время от времени, некоторые характеристики моего приложения Rails, похоже, не случайно, потому что вдруг английский язык не является языком по умолчанию больше, но немецкий:функции моего приложения Rails терпеть неудачу случайно из-за неправильной локали по умолчанию
expected: "Project test customer - Project test name (Audit, Access for all, 2015-06-15).pdf"
got: "Project test customer - Project test name (Audit, Zugang für alle, 2015-06-15).pdf"
Как видно, часть «Доступ для всех» внезапно «Zugang für alle». Я googled для решения, и кажется, что I18n.locale
is a global object, so when it's changed in a spec, it persists.
Проблема не всегда возникает, но я могу воспроизвести ее при указании семени следующим образом: rspec --seed 51012
. Таким образом, действительно кажется, что проблема связана с тем, что спецификация выполняется до (или после) некоторой другой спецификации.
У меня есть функция спецификация, которая проверяет, является ли язык может быть изменена, как это:
it 'offers contents in german' do
visit root_path(locale: :de)
expect(page).to have_content 'Willkommen'
end
Я подозреваю, что это может быть проблематичной спецификация, и когда он запущен в начале, он имеет влияние на других спецификациях.
Я надеялся, что я мог бы решить эту проблему, установив язык в спецификации обратно по умолчанию, как это:
it 'offers contents in german' do
visit root_path(locale: :de)
expect(page).to have_content 'Willkommen'
I18n.locale = :en
end
не работал, и это один не сделал:
it 'offers contents in german' do
visit root_path(locale: :de)
expect(page).to have_content 'Willkommen'
visit root_path(locale: :en)
end
Теперь я немного невежествен. Как я мог отлаживать ситуацию, поэтому я определенно нахожу источник проблемы и исправляю ее (или, по крайней мере, обойти ее)?
Update
Используя ответ Дэйва (rspec --bisect
) Я нашел эту проблему.
# application_controller_spec.rb
describe ApplicationController do
controller(ApplicationController) do
def index
render text: 'Hello World'
end
end
describe 'locale parameter' do
it 'is set to english when not available in the request' do
get :index
expect(I18n.locale).to eq :en
end
it 'can be set through the request' do
get :index, locale: :de
expect(I18n.locale).to eq :de
end
end
end
В зависимости от того, что эти данные были бежать, локаль была установлена :de
или :en
для следующих спецификаций.
Я установил его с предложенным фрагменте кода Borama в:
RSpec.configure do |config|
config.after(:each) { I18n.locale = :en }
end
Я еще немного удивлен, что RSpec/Rails не делать это самостоятельно автоматически ...
На самом деле вы не указали неудачную спецификацию, которая может помочь – Yule
. Также - попробуйте добавить тот, который, по вашему мнению, вызывает проблему, и тот, который не работает в одном файле rspec, затем просто запустите этот файл , вы можете проверить, что именно эта спецификация вызывает проблему, а не запускает весь пакет – Yule
. Я бы отлаживал текущую 'I18n.locale' перед каждым тестом (что-то вроде' before (: each) {puts I18n.locale} ', таким образом, вы найдете оскорбительный. Кроме того, я бы использовал' after (: each) {I18n.locale =: en} 'для сброса локали после каждого теста. Оба фрагмента кода должны перейдите в 'spec/spec_helper.rb' или' spec/rails_helper.rb'. – BoraMa