2009-05-07 10 views
5

Tengo un número de controladores en mis aplicaciones de Ruby on Rails con un controlador de rescate al final de la acción que básicamente detecta cualquier error no controlado y devuelve algún tipo de error "fácil de usar". Sin embargo, cuando estoy haciendo la prueba de rake me gustaría tener esos manejadores de rescate predeterminados deshabilitados para que pueda ver el error completo & stack trace. ¿Hay alguna forma automatizada para hacer esto?¿Cómo desactivo los manejadores de rescate en las aplicaciones de Ruby on Rails cuando estoy ejecutando pruebas funcionales?

actualización aclarar: Tengo una acción como esta:

def foo 
    # do some stuff... 
rescue 
    render :text => "Exception: #{$!}" # this could be any kind of custom render 
end 

Ahora, cuando esta prueba de funcionamiento, si la excepción se eleva a continuación, voy a obtener sólo un poco de información sobre la excepción, pero lo que me gustaría es que actúe como si no hubiera un controlador de rescate allí, así que obtengo la información completa de depuración.

Actualización: SOLUCIÓN

me hizo esto:

rescue: 
    raise unless Rails.env.production? 
    render :text => "Exception: #{$!}" # this could be any kind of custom render 
    end 

Respuesta

9

No es muy automatizado, pero ¿cómo se modifica el código para volver a lanzar excepciones cada vez que se llama dentro de una prueba?

Tal vez algo como esto:

def foo 
    # do some stuff... 
rescue 
    raise if ENV["RAILS_ENV"] == "test" 
    render :text => "Exception: #{$!}" # this could be any kind of custom render 
end 
+0

¡Lo intentaré! –

+3

raise if Rails.env.test? es más limpio IMO – Scott

+0

@Steven esto realmente no rescata solo en la producción. Se plantea donde está ... pero si tienes 20 líneas de código en el elemento #do, el aumento no da ninguna referencia a esto. La traza indica que se produjo el error en la línea en la que está activada la subida. – baash05

0

¿Has mirado en el uso de la llamada assert_raise(exception1, exception2, ...) { block } y luego imprimir la excepción del bloque?

0

¿Qué método estás usando? Hay dos métodos de rescate en ActionController.

tengo esto en mi base:

def rescue_action_in_public(exception) 
    response_code = response_code_for_rescue(exception) 
    status = interpret_status(response_code) 
    respond_to do |format| 
     format.html { render_optional_error_file response_code} 
     format.js { render :update, :status => status do |page| page.redirect_to(:url => error_page_url(status)) end} 
end 

final

Esto sólo errores pantallas personalizadas en el modo de producción.

+0

¿Por qué sólo se ejecutan en el modo de producción? No veo eso. –

-1

No debería necesitar deshabilitar su bloque de rescate. Use el método assert_raise (como lo sugiere Scott), y en el bloque, llame al método del que espera una excepción.

Por ejemplo:

def test_throws_exception 
    assert_raise Exception do 
    raise_if_true(true) 
    end 
end 
+0

No estoy tratando de hacer una excepción, sé todo sobre cómo hacerlo y lo he hecho muchas veces. Estoy tratando de obtener información completa sobre las excepciones que ocurren cuando no las espero (incluido el seguimiento de la pila), pero solo cuando estoy en modo de prueba. –

+0

Ah. Lo siento. No comprendí lo que estabas tratando de lograr. –

0

creo que la cosa más fácil de hacer es verificar que la correcta era render called-- o lo que fuera diferente del caso normal, no excepcional.

Cuestiones relacionadas