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
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top