2010-02-19 4 views
12
Given I have a rails app 
And I'm using cucumber 
And I'm using capybara 
And I have an action that results in a redirect_to "http://some.other.domain.com/some_path" 
When I test this action 
Then the in-app portion of the test works fine 
But I see this error: No route matches "/some_path" with {:method=>:get} (ActionController::RoutingError) 

이 그래서 카피 바라가 제대로 리디렉션 내 응용 프로그램 이외의 브라우저를 리디렉션 시나리오에 문제를 "http://some.other.domain.com/some_path"하지만 그것이 내 응용 프로그램 내에서 URL의 경로 부분을 처리해야한다고 생각 몇 가지 이유. 참고 capybara는 전혀 문제가 없습니다. "http://some.other.domain.com/"- 경로 부분이없는 URL로 리디렉션하면 테스트를 통과합니다.오이 + 카피 바라 :

이것은 버그입니까?

+5

작은곰에게 질문을 쓰려면 : – zetetic

답변

1

어떤 드라이버를 사용하십니까? Rack-Test 드라이버는 다른 도메인의 항목을 요청할 수 없습니다. Capybara가 Selenium이나 Culerity로 이것을 수행한다면, 그것은 분명히 버그입니다. 문제를 해결하는 데 도움을주고 싶다면 매우입니다.

+0

흥미 롭습니다. 랙 테스트를 사용하고 있습니다. 나는 실제로 다른 도메인에서 데이터를 얻으려고 신경 쓰지 않는다. (나는 FakeWeb을 사용하여 나의 네트를 위조하기 위해 : Http 요청을 배경으로 사용하고있다.) 나는 적절한 URL로 리디렉션되도록하고 싶다. . Culerity 및 Selenium과 함께 사용해 보았습니다. 셀레늄은 괜찮 았어, Culerity는 방문 중 하나에서 이미지/GIF를받는 것에 대해 불평했다. 정말 Selenium을 사용해야 할 필요가 없습니다. 너무 느립니다. – joshsz

+0

(하나의 컨트롤러 작업에서 이미지/gif를 다중 응용 프로그램 로그인 추적 프로세스의 일부로 반환하므로 이미지가 가정됩니다. 나는 URL에 .gif를 덧붙이려고 시도했지만 아직은 culerity barfs) – joshsz

0

내 회사의 SSO 플랫폼에 내 앱을 통합하는 것과 비슷한 상황이있었습니다. 이 문제를 해결 한 방법은 시나리오에 대해 @javascript 태그를 추가하여 Selenium을 실행하는 사이트를 얻는 것입니다.

+0

Akephalos 드라이버와 동일한 문제가 발생했습니다. – Macario

1

@javascript는 현재 작동중인 솔루션입니다. 외부 요청을받은 지점까지 랙 테스트를 사용하는 mechanize driver도 있습니다.

약간 새롭고 아직 시도하지는 않았지만 속도 향상을 위해 외부 @javascript 테스트를 사용하여 (@live 또는 @external 또는 유사한 태그 포함) 테스트를 변경하려고했습니다.

+0

[capybara의 Google 그룹] (http : // groups.google.com/group/ruby-capybara)를 참조하십시오. – nruth

4

나는 당신이 나는 같은 문제가 있다고 생각 : 난 그냥 내 코드가 올바른 상태 코드가 지정된 URL로 리디렉션 것을 확인하고 싶었다, 그러나 나는 아무것도하고 싶지 않아 URL.

문제는 사이트가 예상대로 리디렉션을 반환하지만 Rack :: Test가 테스트중인 응용 프로그램에 모든 것을 해석하고 그 URL이 존재하지 않는다는 것입니다. 그러나 우리는 오류를 잡아서 응답이 어떻게 보이는지 볼 수 있습니다. 이것은 capybara의 기본 드라이버 이외의 다른 기능에서는 작동하지 않을 것입니다. 나는 (오이에 적용 할 수 있습니다) 카피 바라의 시원한 해결책을 찾았습니다

external_redirect "https://api.twitter.com/oauth/authenticate?x_auth_access_type=read&oauth_token=TOKEN" do 
    click_link "Continue with Twitter" 
end 

def external_redirect(url) 
    yield 
rescue ActionController::RoutingError # goes to twitter.com/oauth/authenticate 
    current_url.must_equal url 
else 
    raise "Missing external redirect" 
end 
+0

참고 : 앱에 외부 URL과 일치하는 경로가있는 경우 (예 : 경로가 존재하기 때문에 RoutingError가 발생하지 않는 경우) 혼란스러운 결과를 초래할 수 있습니다. 따라서 일반적인 해결책은 아니지만 작동합니다. :) – mltsy

1

이 작은 조각을 사용.

begin 
    click_button 'Accept' 
rescue ActionController::RoutingError 
    # Capybara doesn't redirect externally, so matches '/cb' but that route doesn't exist 
    expect(page.current_url).to eq "https://example.com/cb?param=123" 
end 
1

:

begin 
    click_button('Pay with Paypal') 
rescue ActionController::RoutingError 
end 

expect(page.status_code).to eq(302) 
expect(page.response_headers['Location']).to include('paypal.com/cgi-bin/websrc') 
관련 문제