2012-01-25 12 views
11

rspec-rails (2.7.0) rails (3.0.10) mensaje: Rails 3.1 Error Catching es irrelevante para mí.Por qué consider_all_requests_local falla con la configuración rspec

Código:

class ApplicationController < ActionController::Base 
    unless Rails.application.config.consider_all_requests_local 
    rescue_from ActiveRecord::RecordNotFound, :with => :render_404 
    rescue_from Exception, :with => :render_500 
    rescue_from FunnyException, :with => :my_errors 

    def my_errors(exception) 
     #some stuff for production 
     puts "=======From top====#{Rails.application.config.consider_all_requests_local}" 
    end 
    else 
    rescue_from FunnyException, :with => :my_errors 
    def my_errors(exception) 
     #some stuff for development 
     puts "=====From bottom======#{Rails.application.config.consider_all_requests_local}" 
    end 
    end 
end 

Este código funciona perfectamente con la producción/desarrollo ... problema es cuando quiero probarlo con rspec. ¿Cómo cambiar el caso de prueba entre entornos?

He intentado añadir algo como:

before do 
    Rails.application.config.consider_all_requests_local = true 
end 

me sale:

... ===== ====== Desde la parte inferior verdadera ===== De. ====== inferior cierto. ===== ====== De inferior cierto. ===== ====== Desde la parte inferior verdadera

por lo intentaron

before do 
    Rails.application.config.consider_all_requests_local = false 
end 

por lo que se obtiene:

... ===== ====== De abajo falsa ===== ====== De abajo falsa ===.. == De inferior ====== falsa. ===== ====== De abajo falsa

¿Cómo es eso posible? ... lo mismo con el cambio de spec_helper

config.before(:each) do 
    Rails.application.config.consider_all_requests_local = false 
end 

unless is not working. Top sección es inalcanzable con rspec ... siempre coincide con Parte inferior ¿por qué? Supongo que de alguna manera está relacionado con Rack ... pero ¿hay alguna solución para cambiar dinámicamente este comportamiento dentro de rspec?

respecto

Respuesta

21

Ok He encontrado una solución bastante fácil

before do 
    Rails.application.config.consider_all_requests_local = false 
    load "application_controller.rb" 
end 

after do 
    Rails.application.config.consider_all_requests_local = true 
    load "application_controller.rb" 
end 

Es parte de la suite de prueba del controlador de la aplicación en el anonimato.

Tiene que agregar después del bloque ... porque este cambio persistirá a través de otras suites.

Cualquier mejora bienvenida: D

edición: Uso de spork y guardia causas para mí a veces errores aleatorios ... antes: todo parece resolver ese problema

+3

No estoy seguro si mi situación es la misma, pero tuve que agregar: 'Rails.application.config.action_dispatch.show_exceptions = true' al bloque anterior. y '... = falso' al después. –

+0

Solución increíble, exactamente lo que estaba buscando. ¡Gracias! –

+2

Me está fallando cuando estoy ejecutando el paquete completo usando 'rake spec'. Pasa solo cuando ejecuto la especificación 'feature' específica. –

0

El bloque lógico se define en el nivel de clase, que consigue evalúa durante el tiempo de carga de clase. Es por eso que no pasará a 'else' incluso si lo establece manualmente en falso en tiempo de ejecución.

También tengo curiosidad por saber cuál es la mejor manera de probar esto. Mi única pista es de alguna manera volver a cargar o volver a evaluar ActionController, similar a recargar! método en la consola de rieles.

0

He descubierto que con el pepino-carriles de la manera correcta de hacerlo es agregar la etiqueta @ allow-rescue.

Cuestiones relacionadas