AbstractController :: DoubleRenderError con mi respond_to en rspec

Tengo esta acción de Rails3:

def export
  respond_to do |format|
    format.tdl { render :xml => @template.export_as_tdl and return }
    format.json { render :json => @template.export_as_json }
  end
end

y filtrar antes de la exportación:

def find_environment
  @environment = KTEnvironment.find(params[:environment_id])
  raise HttpErrors::NotFound, _("Couldn't find environment '#{params[:environment_id]}'") if @environment.nil?
  @environment
end

y esta rspec:

describe "export" do
  it "should call export_as_json" do
    @tpl.should_receive(:export_as_json)

    get :export, :id => TEMPLATE_ID
  end

  it "should call export_as_tdl" do
    @tpl.should_receive(:export_as_tdl)

    get :export, :id => TEMPLATE_ID, :format => 'tdl'
  end
end

También definí el siguiente tipo MIME:

Mime::Type.register "application/tdl-xml", :tdl

Cuando intento ejecutar mis pruebas de rspec, obtengo constantemente:

 1) Api::TemplatesController export should call export_as_tdl
 Failure/Error: get :export, :id => TEMPLATE_ID, :format => 'tdl'
 AbstractController::DoubleRenderError:
   Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return".
 # ./app/controllers/api/api_controller.rb:135:in `render_exception'
 # ./app/controllers/api/api_controller.rb:133:in `render_exception'
 # ./app/controllers/api/api_controller.rb:22:in `__bind_1314974553_619675'
 # ./spec/controllers/api/templates_controller_spec.rb:178

No tengo ni idea de lo que está sucediendo allí. Este es mi código de representación de excepción:

def render_wrapped_exception(status_code, ex)
  logger.error "*** ERROR: #{ex.message} (#{status_code}) ***"
  logger.error "REQUEST URL: #{request.fullpath}"
  logger.error pp_exception(ex.original.nil? ? ex : ex.original)
  orig_message = (ex.original.nil? && '') || ex.original.message
  respond_to do |format|
    format.json do
      render :json => {
        :errors => [ ex.message, orig_message ]
      }, :status => status_code
    end
    format.all do
      render :text => "#{ex.message} (#{orig_message})",
        :status => status_code
    end
  end
end

Ah, entonces se llama al método general render_exception en mi api_controller. Parece que:

def render_exception(status_code, exception)
  logger.error pp_exception(exception)
  respond_to do |format|
    format.json { render :json => {:errors => [ exception.message ]}, :status => status_code }
    format.all  { render :text => exception.message, :status => status_code }
  end
end

preguntado el 02 de septiembre de 11 a las 14:09

¿Puedes decir qué líneas templates_controller_spec.rb:178 y api_controller.rb:22 ¿están? -

Mi conjetura es que tu acción de alguna manera genera una excepción, lo que arruina todo. ¿Podrías también publicar el render_exception en tu controlador api? -

Adicional. También hay un filtro antes de la acción. Agregué ese también. -

¡Aaaah hay render_exception! Entonces sucedió algo malo. Déjame ver. -

¿Qué sucede si deshabilita el código de excepción y deja que aparezcan? Es posible que vea que la causa raíz surge por sí sola. -

1 Respuestas

Intente deshabilitar su controlador de errores, la causa raíz debería aparecer por sí sola.

Respondido el 02 de Septiembre de 11 a las 19:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.