2015-08-18 4 views
0

В моей config.routes.rb файле:Как настроить тесты rspec для использования стандартной локали в Rails?

scope '(:locale)' do 
    resources :techniques, path: '/applications' do 
     get '/complete_list' => 'techniques#complete_list' 
    end 
end 

В моих Gemfile:

group :development, :test do 
    gem 'rspec-rails' 
    gem 'byebug' 
    gem 'better_errors' 
    gem 'factory_girl_rails' 
    gem 'faker' 
end 

group :test do 
    gem 'poltergeist' 
    gem 'capybara' 
    gem 'launchy' 
    gem 'database_cleaner' 
end 

В моих application_controller.rb:

before_filter :set_locale 
    def set_locale 
    I18n.locale = params[:locale] || I18n.default_locale 
    end 

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

В моей спецификации:

visit techniques_path 

Он всегда терпит неудачу с:

I18n::InvalidLocale - "applications" is not a valid locale: 

И он выделяет эту строку в моей application_controller:

I18n.locale = params[:locale] || I18n.default_locale 

я могу сделать вещи работать путем изменения спецификации читать как:

visit techniques_path(locale: :en) 

Но я думал, что настройка default_url_options в контроллере приложения позаботится об этом автоматически. Что мне здесь не хватает?

ответ

1

Если вы хотите, чтобы проверить поведение от ApplicationController, вам нужен так называемый анонимный контроллер, контроллер, который наследуется от ApplicationController и является проверяемым:

describe ApplicationController do 
    controller do 
    def index  
    end 
    end 

    describe "language setting" do  
    it "uses parameter" do 
     expect(I18n).to receive(:locale=).with('en') 
     get :index, locale: 'en' 
    end 

    it "falls back to default_locale" do 
     I18n.default_locale = 'nl' 
     expect(I18n).to receive(:locale=).with('nl') 
     get :index 
    end 
    end 
end 

Edit: Теперь я вижу, что вы должны добавить Locales параметров к функциональным испытаниям.

Если вы хотите, чтобы передать параметры в пути, просто добавьте их в виде хэша:

visit techniques_path({locale: 'en'}) 

Однако, я считаю, это плохая практика, чтобы использовать url_helpers в художественных-тестах. Я предполагаю, что «визит» - это функция/интеграция-тест, так как я не видел, чтобы он использовался в другом месте. Вместо этого, при тестировании чистой интеграции, использовать фактические строки в качестве путей:

visit '/en/techniques/1234' 
visit "/en/techniques/@technique.id" 

Это а.о. сообщает, что тесты функций - это отдельное приложение: одно, которое не зависит от внутреннего состояния приложения. Как будто это «пользователь», используя браузер, щелкнув приложение. Пользователь, используя firefox, не может использовать «method_path», он может только нажимать на ссылки или вводить URL-адрес в панель браузера.

 Смежные вопросы

  • Нет связанных вопросов^_^