Question

Ci-dessous, j'ai énuméré du code provenant d'une simple application Rails. Le test répertorié ci-dessous échoue à la dernière ligne, car le champ updated_at de la publication n'est pas modifié dans l'action de mise à jour de PostController dans ce test. Pourquoi?

Ce comportement me semble un peu étrange, car des horodatages standard sont inclus dans Post model, tester en direct sur le serveur local indique que ce champ est réellement mis à jour après le retour de l'action de mise à jour et la première assertion réalisée. ainsi, il montre que l'action de mise à jour s'est bien passée.

Comment puis-je créer des fixtures actualisables avec la signification ci-dessus?

# 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
Était-ce utile?

La solution

posts(:one)

Cela signifie que "récupérez le projecteur nommé": one ". dans posts.yml. Cela ne changera jamais pendant un test, à l'exception d'un code extrêmement étrange et destructeur qui n'a pas sa place dans des tests sensés.

Ce que vous voulez faire est de vérifier l'objet assigné par le contrôleur.

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

Autres conseils

Remarque si vous utilisiez Shoulda ( http://www.thoughtbot.com/ projects / shoulda / ), il se présenterait ainsi:

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 est génial.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top