Pregunta

A continuación, enumeré algunos códigos de la aplicación Rails simple. La prueba enumerada a continuación falla en la última línea, porque el campo updated_at de la publicación no se modifica dentro de la acción de actualización de PostController en esta prueba. ¿Por qué?

Este comportamiento me parece un poco extraño, ya que las marcas de tiempo estándar se incluyen en el modelo de publicación, prueba en vivo en el servidor local muestra que este campo se actualiza realmente después de regresar de la acción de actualización y se cumple la primera afirmación por lo tanto, muestra que la acción de actualización fue correcta.

¿Cómo puedo hacer que los accesorios se actualicen en el significado anterior?

# app/controllers/post_controller.rb
def update
  @post = Post.find(params[:id])
  if @post.update_attributes(params[:post])
    redirect_to @post     # Update went ok!
  else
    render :action => "edit"
  end
end

# test/functional/post_controller_test.rb
test "should update post" do
  before = Time.now
  put :update, :id => posts(:one).id, :post => { :content => "anothercontent" }
  after = Time.now

  assert_redirected_to post_path(posts(:one).id)     # ok
  assert posts(:one).updated_at.between?(before, after), "Not updated!?" # failed
end

# test/fixtures/posts.yml
one:
  content: First post
¿Fue útil?

Solución

posts(:one)

Eso significa que " busca el dispositivo llamado ": uno " en posts.yml. Eso nunca cambiará durante una prueba, a menos que exista un código extremadamente extraño y destructivo que no tenga lugar en pruebas sanas.

Lo que quieres hacer es verificar el objeto que el controlador está asignando.

post = assigns(:post)
assert post.updated_at.between?(before, after)

Otros consejos

En una nota al margen si estaba utilizando shoulda ( http://www.thoughtbot.com/ proyectos / shoulda / ) se vería así:

context "on PUT to :update" do
    setup do 
        @start_time = Time.now
        @post = posts(:one)
        put :update, :id => @post.id, :post => { :content => "anothercontent" } 
    end
    should_assign_to :post
    should "update the time" do
        @post.updated_at.between?(@start_time, Time.now)
    end
end

Shoulda es impresionante.

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