Domanda

Di seguito ho elencato un codice dalla semplice applicazione Rails. Il test elencato di seguito ha esito negativo nell'ultima riga, poiché il campo updated_at del post non viene modificato nell'ambito dell'azione di aggiornamento di PostController in questo test. Perché?

Questo comportamento mi sembra un po 'strano, poiché i timestamp standard sono inclusi nel modello Post, test dal vivo sul server locale mostra che questo campo è effettivamente aggiornato dopo il ritorno dall'azione di aggiornamento e la prima asserzione è soddisfatta quindi mostra che l'azione di aggiornamento è andata bene.

Come posso rendere i dispositivi aggiornabili nel significato sopra?

# 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
È stato utile?

Soluzione

posts(:one)

Ciò significa che "recupera il dispositivo chiamato": uno " in posts.yml. Questo non cambierà mai durante un test, escludendo un codice estremamente strano e distruttivo che non ha posto nei test sani.

Quello che vuoi fare è controllare l'oggetto che il controller sta assegnando.

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

Altri suggerimenti

In una nota a margine se stavi usando shoulda ( http://www.thoughtbot.com/ progetti / shoulda / ) sarebbe simile a questo:

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 è fantastico.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top