2010-02-19 20 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) 

Así capibara se redirige correctamente a "http://some.other.domain.com/some_path" pero por alguna razón se piensa que debe manejar la parte de la ruta de la URL dentro de mi aplicación. NOTA capybara no tiene ningún problema con "http://some.other.domain.com/" - mis pruebas pasan si redirijo a una URL sin una porción de ruta.Pepino + Carpincho: Problema con un escenario que redirige el navegador fuera de mi aplicación

¿Esto es un error?

+5

+1 para escribir su pregunta en Gherkin :) – zetetic

Respuesta

1

¿Qué driver estás usando? El controlador Rack-Test no le permitirá solicitar material de otros dominios. Si Capybara está haciendo esto con Selenium o Culerity, definitivamente es un error. Si desea ayudar a solucionarlo, escribir una especificación anómala sería muy apreciada :)

+0

Interesante. Estoy usando Rack-Test. Realmente no me importa recuperar los datos del otro dominio (estoy usando FakeWeb para falsificar mis solicitudes de Net :: Http que ocurren detrás de las escenas), solo quiero asegurarme de que me redireccionen a la URL adecuada. . Lo probé con Culerity y Selenium. El selenio estaba bien, Culerity se quejó de recibir una imagen/gif en una de las visitas. Realmente preferiría no tener que usar Selenium para esto, es muy lento :) – joshsz

+0

(Tengo una acción de controlador devolver una imagen/gif como parte de un proceso de seguimiento de inicio de sesión de aplicaciones múltiples, por lo que se supone que la imagen estar allí. Intenté anexar .gif a la url, pero aún así barfs) – joshsz

0

Tuve una situación similar en la que estaba integrando mi aplicación con la plataforma SSO de la compañía. La forma en que solucioné esto fue hacer que el sitio ejecutara Selenium agregando la etiqueta @javascript al escenario.

+0

Mismo problema con el controlador de Akephalos – Macario

1

@javascript es una solución actualmente en funcionamiento, aunque también está en proceso un mechanize driver, que usa la prueba en rack hasta el punto en que se atiende una solicitud externa.

Es un poco nuevo y no lo he intentado todavía, pero me refiero a cambiar mis pruebas externas de @javascript para usarlo (etiquetado con @live o @external o similar) para aumentar la velocidad.

+0

Eche un vistazo a [grupo de google de capybara] (http: // groups.google.com/group/ruby-capybara) para la discusión de esto. – nruth

4

Creo que tenía el mismo problema que tú: Sólo quería confirmar que mi código redirige a la URL dada con el código de estado correcto, pero yo no quiero hacer nada en ese URL.

El problema es que el sitio devuelve la redirección como se esperaba, pero Rack :: Test interpreta todo en la aplicación bajo prueba, y esa URL probablemente no exista. Pero podemos detectar el error y ver cómo era la respuesta. Esto probablemente no funcionará con nada más que el controlador predeterminado de capibara.

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') 
+0

Nota: esto puede causar resultados confusos si su aplicación tiene una ruta que coincide con la URL externa (es decir, si no levanta RoutingError, porque la ruta existe), por lo que no es una gran solución general, ¡pero funciona! :) – mltsy

1

El uso de este pequeño fragmento:

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 
1

que he encontrado una solución fresca para Capybara (que puede ser adaptado en pepino).

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 
Cuestiones relacionadas