2010-08-03 1 views
2

내 Rails 3 앱에는 iPhone과 데스크톱 브라우저의 레이아웃이 다릅니다. Cucumber/Capybara를 사용하여 iPhone 레이아웃을 테스트하려고합니다. 지금까지 요청의 HTTP 헤더에서 iPhone User-Agent 문자열을 설정하려고 시도한 모든 시도가 실패했습니다.Rails 3에서 Cucumber/Capybara를 사용하면 사용자 정의 사용자 문자열을 어떻게 설정합니까?

나는 Testing custom headers and ssl with Cucumber and Capybara 자습서를 따라 왔지만 HTTP 요청에서 User-Agent 문자열을 설정하지 않는 것 같습니다.

내 iPhone을 사용하여 내 Rails 앱을 탐색하면 올바른 레이아웃을 얻을 수 있습니다. Rack-Mobile-Detect을 사용하여 Rails request.format을 다음과 같이 설정합니다.

이 아이디어를 만드는 방법에 대한 아이디어가 있으십니까? 나는 카피 바라를 버리고 Webrat로 돌아갈 준비가되었습니다.

는 여기에 지금까지이 작업은 다음과 같습니다

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.rb이

# 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) 

답변

1

이봐. 다행히 내 게시물을 찾았습니다 ;-)

Rack::Test이 헤더를 컨트롤러에 전달했는지 확인 했습니까? 컨트롤러에서 Rails.logger.info("Headers: #{headers.inspect}")과 같은 것을 시도한 다음 로그 파일을 검사 할 수 있습니다.

6

이에 조금 바이올린했지만, 결국 나는 추가하여 바로 작업을 진행하게 관리 :

# 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) 

당신은 내가 쓴이 blog post에서 더 많은 정보를 얻을 수 있습니다,하지만 기본적입니다.

+0

간단합니다. 감사! –

관련 문제