Автоопределение локали из браузера WWW и тестирование с помощью Cucumber - PullRequest
3 голосов
/ 21 декабря 2009

Я тестирую свое приложение с Cucumber, и оно работало до того, как я добавил автоопределение локалей из WWW-браузера в application_controller.rb:

  before_filter :set_locale

  private

    def set_locale
      xxx = request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first
      if xxx.match /^(en|fr)$/
        I18n.locale = xxx
      else
        I18n.locale = 'en'
      end
    end

У меня есть сценарий:

  Scenario: Successful sign up
    Given I am an anonymous user
    And I am on the home page
    When ...

Когда я запускаю огурец , я получаю сообщение об ошибке:

Given I am an anonymous user                   # features/step_definitions/user_steps.rb:7
And I am on the home page                      # features/step_definitions/webrat_steps.rb:6
  private method `scan' called for nil:NilClass (NoMethodError)
  C:/workspace/jeengle/app/controllers/application_controller.rb:33:in `set_locale'
  c:/worktools/ruby/lib/ruby/1.8/benchmark.rb:308:in `realtime'
  (eval):2:in `/^I am on (.+)$/'
  features/manage_users.feature:8:in `And I am on the home page'

Я пытался сделать это в перед оператором в папке step_definitions:

Before do
  request.env['HTTP_ACCEPT_LANGUAGE'] = "en"
end

но у меня есть другая ошибка:

  undefined method `env' for nil:NilClass (NoMethodError)

Кто-нибудь знает, как инициализировать / эмулировать request.env ['HTTP_ACCEPT_LANGUAGE'] в огурце?


ОБНОВЛЕНО

Тест на огурец прошел, когда я переписал set_locale Метод:

  xxx = request.env['HTTP_ACCEPT_LANGUAGE']    
  if xxx
    xxx = xxx.scan(/^[a-z]{2}/).first
    if xxx.match /^(en|ru)$/
      I18n.locale = xxx
  end
  else
    I18n.locale = 'en'
  end

Это не решение, но оно работает.

Ответы [ 2 ]

4 голосов
/ 23 декабря 2009

На самом деле проблема кроется в вебрате, а не в огурце. Последовательность событий (примерно)

  • Огурец запускает вашу функцию
  • Когда достигается шаг «Я на главной странице», он вызывает Webrat для отправки запроса контроллеру
  • Webrat создает запрос и отправляет его контроллеру
  • Шаг завершается ошибкой, поскольку в запросе отсутствует заголовок «Accept-Language»

Судя по всему, Webrat не добавляет этот заголовок при создании запроса. Однако Webrat предлагает обходной путь: метод «заголовка», с помощью которого можно задать любой заголовок на время запроса.

Таким образом, чтобы сделать эту работу, добавьте шаг, который вставляет в заголовок, например ::

Given /^an Accept Language header$/ do
  header "Accept-Language", "en;en-us" # or whatever value you need for testing
end`

Выполните этот шаг, прежде чем посетить страницу, и Вебрат больше не будет сбит с толку.

Кстати, я получил это от Rspec Book , которая действительно хорошо объясняет, как эти вещи BDD сочетаются друг с другом.

2 голосов
/ 25 декабря 2009

Другой способ - «один и тот же, но другой». Вы можете добавить инструкцию перед в вашем файле определения шага:

Before do
  header 'Accept-Language', 'en-US' 
end

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

...