Pregunta

Tengo un controlador con una acción POST llamada create.En la acción de crear utilizo un joya puntopagos clase (PuntoPagos::Request) que utiliza el joya de descanso-cliente para hacer un POST a una API:

class SomeController < ApplicationController

  def create
    request = PuntoPagos::Request.new
    response = request.create
    #request.create method (another method deeper, really)
    #does the POST to the API using rest-client gem.

    if response.success?    
      #do something on success
    else
      #do something on error
    end
  end

end

¿Cómo puedo, con RSpec, bloquear la solicitud y la respuesta del cliente de descanso para probar mi acción de creación?

¿Fue útil?

Solución

solo trozo PuntoPagos::Request.new y sigue golpeando:

response = double 'response'
response.stub(:success?) { true }
request = double 'request'
request.stub(:create) { response }
PuntoPagos::Request.stub(:new) { request }

Eso es para una solicitud exitosa;hazlo de nuevo con success? aplastado para regresar false para probar esa rama.

Una vez que tengas eso funcionando, mira stub_chain hacer lo mismo con menos escritura.

Dicho esto, sería mucho mejor extraer el material de PuntoPagos en una clase separada con una interfaz más simple:

class PuntoPagosService
  def self.make_request
    request = PuntoPagos::Request.new
    response = request.create
    response.success?
  end
end

Entonces puedes simplemente hacer

PuntoPagosService.stub(:make_request) { true }

en tu prueba.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top