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

В моем приложении Rails 3 у меня есть разные макеты для iPhone и настольных браузеров.Я пытаюсь проверить макет iPhone с помощью огурца / капибары.До сих пор все мои попытки установить строку User-Agent iPhone в заголовке HTTP запроса провалились.

Я следовал Тестированию пользовательских заголовков и ssl с помощью учебника Cucumber и Capybara , но этопохоже, что в запросе HTTP строка User-Agent не установлена.

Если я просто перехожу к своему приложению Rails с помощью iPhone, я получаю правильный макет.Я использую Rack-Mobile-Detect , чтобы установить для Rails request.format значение: iphone.

Есть идеи, как заставить это работать?Я почти готов бросить Капибару и вернуться в Вебрат.

Вот что у меня есть:

Feature: Detect Browser
  In order to have different layouts for iPhone vs. desktop browsers
  As a developer
  I want to show different layouts for different browsers

Scenario: Show home page with desktop layout 
  Given I am using "a desktop browser"
  When I go to "the home page"
  Then I should see "desktop browser"

Scenario: Show home page with iPhone layout
  Given I am using "mobile safari"
  When I go to "the home page"
  Then show me the page
  Then I should see "mobile safari"

Detect_browser_steps.rb

Given /^(?:|I )am using (.+)$/ do |browser|
  case browser
  when "mobile safari"
    agent = "Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_1_2 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7D11 Safari/528.16"
    add_headers({'User-Agent' => agent})
  else
    # don't set a special User-Agent header
  end
end

headers_hack.рб

# http://aflatter.de/2010/06/testing-headers-and-ssl-with-cucumber-and-capybara/
# The following solution will work only if you use the :rack_test driver.
module RackTestMixin

  def self.included(mod)
    mod.class_eval do
      # This is where we save additional entries.
      def hacked_env
        @hacked_env ||= {}
      end

      # Alias the original method for further use.
      alias_method  :original_env, :env

      # Override the method to merge additional headers.
      # Plus this implicitly makes it public.
      def env
        original_env.merge(hacked_env)
      end
    end
  end

end

Capybara::Driver::RackTest.send :include, RackTestMixin

module HeadersHackHelper

  def add_headers(headers)
    page.driver.hacked_env.merge!(headers)
  end

end

World(HeadersHackHelper)

Ответы [ 2 ]

6 голосов
/ 14 февраля 2012

Пришлось немного поиграть с этим, но в итоге мне удалось заставить его работать, просто добавив:

# features/support/capybara_headers.rb:

module CapybaraHeadersHelper
  def add_headers(headers)
    headers.each do |name, value|
      page.driver.browser.header(name, value)
    end
  end
end
World(CapybaraHeadersHelper)

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

1 голос
/ 18 августа 2010

Привет.Рад, что вы нашли мой пост; -)

Вы проверяли, передает ли Rack::Test ваш заголовок контроллеру?Вы можете попробовать что-то вроде Rails.logger.info("Headers: #{headers.inspect}") в вашем контроллере, а затем проверить файл журнала.

...