es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo enviar una solicitud mock POST con Rack en una aplicación de ruby-on-rails?

Estoy midiendo el tiempo dedicado a varios aspectos de una aplicación de blog en Rails, generada con: rails new myblog --database=sqlite3. Lo estoy utilizando sin modificaciones y la base de datos contiene artículos de blog. Hasta ahora, solo estaba probando el tiempo dedicado a las solicitudes GET en artículos específicos. Para esto, estoy utilizando Rack y su MockRequest, aquí hay un extracto de mi archivo de pruebas:


app = Rails.application
env = Rack::MockRequest::env_for("http://localhost/blog_posts/25")
resp = app.call(env)
unless resp.first == 200
raise "error with response #{resp.first}"
end

Me di cuenta de que utilizado de esta manera, mis llamadas a env_for solo realizan solicitudes GET, y me gustaría agregar una nueva publicación de blog a mi base de datos utilizando una solicitud POST, pero no sé cómo hacerlo. Lo más cerca que llegué es modificando mi script de prueba de la siguiente manera, pero siempre recibo una respuesta 422 (“El cambio que deseaste fue rechazado. Tal vez intentaste cambiar algo a lo que no tienes acceso.”):


app = Rails.application
env = Rack::MockRequest::env_for("http://localhost/blog_posts", :method => "POST", :params => {content: "lorem ipsum body", title: "lorem ipsum title", created_at: DateTime.now(), updated_at: DateTime.now()})
resp = app.call(env)
unless resp.first == 200
raise "error with response #{resp.first}"
end

Entonces, mis preguntas son:
– ¿Puedo hacer una solicitud POST simulada con Rack y modificar la base de datos?
– Si es posible, ¿Debo cambiar los permisos en la base de datos en algún lugar? ¿O el problema proviene de otro lugar?
– Si no es posible, ¿hay alguna solución alternativa? Esto es solo para pruebas, así que no hay problemas de seguridad, aunque preferiría seguir utilizando solicitudes simuladas ya que se adapta mejor a mi infraestructura de pruebas.

Como información adicional, esta es la estructura de la base de datos:


create_table "blog_posts", force: :cascade do |t|
t.string "title"
t.text "content"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
end

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes hacer una solicitud de prueba POST con Rack y modificar la base de datos. El problema en tu implementación actual es que estás pasando los campos created_at y updated_at como objetos de DateTime, pero ActiveRecord espera que sean cadenas de texto.

    Para solucionar esto, puedes modificar tu script de prueba para pasar las marcas de tiempo como cadenas de texto:

    app = Rails.application
    env = Rack::MockRequest::env_for("http://localhost/blog_posts", method: "POST", params: { 
        title: "lorem ipsum título", 
        content: "lorem ipsum contenido", 
        created_at: DateTime.now.to_s, 
        updated_at: DateTime.now.to_s 
    })
    resp = app.call(env)
    a menos que resp.first == 200
        raise "error con respuesta #{resp.first}"
    fin
    

    Esto debería permitirte crear una nueva publicación de blog en la base de datos con una solicitud POST.

    No debería ser necesario cambiar los permisos en la base de datos. El problema estaba en el formato de los campos de marca de tiempo.

    Nuevamente, es importante tener en cuenta que esto solo es para fines de prueba y no debe utilizarse en producción.

Comments are closed.