Капибара не передает заголовок после отправки формы - PullRequest
45 голосов
/ 20 апреля 2011

Я создаю приложение Rails 3, которое отображает различные представления для мобильных устройств (с использованием jQuery Mobile) и обычных браузеров для настольных компьютеров. Я тестирую с Cucumber / Capybara, и у меня есть отдельные тестовые наборы для мобильного телефона и браузера. Я могу установить строку «Мобильный пользователь-агент» в HTTP-заголовке запроса, просто используя «взлом заголовков», найденный здесь…

Используя Cucumber / Capybara в Rails 3, как мне установить пользовательскую строку User-Agent?

Проблема ...

Большинство моих мобильных шагов Cucumber работают нормально (например, я установил мобильный заголовок на шаге, после чего мобильные представления просматриваются). Однако после отправки формы тест затем отображает представление следующего шага в браузере (а не в мобильном представлении, которое мне нужно). Я думаю, это может быть связано с тем, что Capybara удаляет заголовок после действия отправки формы.

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

def show
    # …
    logger.info("Headers: #{request.user_agent}")
    # …
end

Я использовал заголовок iPhone (покупателем является ресурс). В моем test.log я вижу:

Для действия создания ...

Started POST "/buyers" for 127.0.0.1 at 2011-04-19 16:49:18 -0700
Processing by BuyersController#create as HTML
  #...
Headers: Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7
  #...
Redirected to http://www.example.com/buyers/1
Completed 302 Found in 7ms

Для последующего действия шоу (примечание «Заголовки:» пусто)…

Started GET "/buyers/1" for 127.0.0.1 at 2011-04-19 16:49:18 -0700
Processing by BuyersController#show as HTML
 #...
Headers: 
 #...
Completed 200 OK in 4ms (Views: 2.8ms | ActiveRecord: 1.4ms)

Как и следовало ожидать, шаг «покажи мне страницу» затем отображает страницу браузера, а не нужную мне мобильную страницу.

Как сохранить заголовок, чтобы все мои мобильные шаги выполнялись в моем наборе мобильных тестов?

Обновление

Jnicklas (создатель действительно потрясающего драгоценного камня Капибара!) Отвечает:

«Это больше вопрос, чем проблема, тбх. В Rack-Test в настоящее время нет никакого способа добиться такого короткого исправления обезьяны, о котором я знаю. Я думал о добавлении опции заголовка к драйверу для тестирования в стойке, которая позволила бы передавать различные опции заголовка. Если вы используете много JavaScript, Selenium в любом случае лучше подойдет и позволяет свободно настраивать пользовательский агент, IIRC. ”

https://github.com/jnicklas

https://github.com/jnicklas/capybara

Ответы [ 2 ]

5 голосов
/ 24 июня 2011

Эта функция была добавлена ​​в Capybara 25 апреля 2011 года с этим коммитом - https://github.com/jnicklas/capybara/commit/a00435d63085ac2e74a0f64e7b7dedc0f7252ea9

Теперь вы можете указать собственный заголовок при использовании собственного драйвера Capybara.См. http://automagical.posterous.com/creating-a-custom-capybara-driver для примеров кода.

2 голосов
/ 15 августа 2012

Вот как мы это исправили, чтобы работать и с javascript (обратите внимание, используйте remove_headers в вашем блоке After):

module CapybaraHeadersHelper
  def add_headers(headers)
    headers.each do |name, value|
      case page.driver.class.to_s
      when "Capybara::RackTest::Driver"
        page.driver.options[:headers] ||= {}
        page.driver.options[:headers][name.to_s] = value

      when "Capybara::Driver::Webkit"
        page.driver.browser.header name, value

      end
    end
  end

  def remove_headers(headers)
    headers.each do |name|
      case page.driver.class.to_s
      when "Capybara::RackTest::Driver"
        page.driver.options[:headers] ||= {}
        page.driver.options[:headers].delete name.to_s

      when "Capybara::Driver::Webkit"
        page.driver.browser.header name, nil

      end
    end
  end
end

World(CapybaraHeadersHelper)
...