Comment rendre les fixtures modifiables dans les tests de Rails?
-
05-07-2019 - |
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
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.