2016-03-16 3 views
4

время от времени, некоторые характеристики моего приложения 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 не делать это самостоятельно автоматически ...

+0

На самом деле вы не указали неудачную спецификацию, которая может помочь – Yule

+0

. Также - попробуйте добавить тот, который, по вашему мнению, вызывает проблему, и тот, который не работает в одном файле rspec, затем просто запустите этот файл , вы можете проверить, что именно эта спецификация вызывает проблему, а не запускает весь пакет – Yule

+1

. Я бы отлаживал текущую 'I18n.locale' перед каждым тестом (что-то вроде' before (: each) {puts I18n.locale} ', таким образом, вы найдете оскорбительный. Кроме того, я бы использовал' after (: each) {I18n.locale =: en} 'для сброса локали после каждого теста. Оба фрагмента кода должны перейдите в 'spec/spec_helper.rb' или' spec/rails_helper.rb'. – BoraMa

ответ

3

Закомментируйте что вы подозреваете и запускаете rspec --seed 51012. Если это пройдет, вы знаете преступника.

Если нет, это выглядит как работа для rspec --bisect. Do

rspec --seed 51012 --bisect 

и пусть RSpec найдет минимальный набор примеров (возможно 2), которые воспроизводят сбой. Затем вы можете решить, что делать с виновником.

Эта функция доступна в RSpec 3.3 и лучше в RSpec 3.4.Подробнее здесь: https://relishapp.com/rspec/rspec-core/docs/command-line/bisect

+0

Ничего себе, знал о 'git bisect', но не о' rspec --bisect'! Очень хорошие новости. Я нашел проблему и обновил вопрос. Спасибо! –