Wie machen Armaturen in Rails' Tests aktualisierbar?
-
05-07-2019 - |
Frage
Im Folgenden werde ich einige Code von einfachen Rails-Anwendung aufgeführt. Der Test aufgelistet nicht unten in letzter Zeile, weil die updated_at die Post nicht innerhalb der Update-Aktion von Postcontroller in diesem Test geändert. Warum?
Dieses Verhalten scheint mir ein wenig seltsam, weil Standard-Zeitstempel in Post-Modell enthalten sind, Live-Tests auf lokalen Server zeigt, dass dieses Feld tatsächlich nach der Rückkehr von Update-Aktion und erster Behauptung aktualisiert wird erfüllt so zeigt es die Update-Aktion ging in Ordnung.
Wie kann ich Armaturen machen aktualisierbar in obiger Bedeutung?
# 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
Lösung
posts(:one)
Das bedeutet, dass „das Gerät holen namens‚ eine‘in posts.yml Das ist nie während eines Tests ändern gehen, abgesehen von einem paar extrem seltsam und destruktiven Code, die keinen Platz in sane Tests hat
.Was möchten Sie ist das Objekt tun überprüfen, die der Controller zugewiesen wird.
post = assigns(:post)
assert post.updated_at.between?(before, after)
Andere Tipps
Auf einer Seite zur Kenntnis, wenn Sie shoulda verwendet haben ( http://www.thoughtbot.com/ Projekte / shoulda / ) es würde wie folgt aussehen:
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 ist genial.