Pergunta

Abaixo eu listei alguns códigos de simples aplicação Rails. O teste listados abaixo falhar na última linha, porque o updated_at campo do post não é alterada dentro da ação de atualização de PostController neste teste. Por quê?

Este comportamento parece-me um pouco estranho, porque timestamps padrão estão incluídos em Post modelo, testes ao vivo em programas de servidor local que este campo é realmente atualizados depois de voltar de ação de atualização e primeira afirmação é cumprida assim ele mostra a ação de atualização foi ok.

Como posso fazer luminárias atualizável no significado acima?

# 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
Foi útil?

Solução

posts(:one)

Isso significa "buscar o dispositivo elétrico com o nome ':.. Um' em posts.yml Isso nunca vai mudar durante um teste, salvo algum código extremamente estranho e destrutivo que não tem lugar em testes sãs

O que você quer fazer é verificar o objeto que o controlador está atribuindo.

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

Outras dicas

Em uma nota lateral, se você estivesse usando shoulda ( http://www.thoughtbot.com/ projectos / shoulda / ) que seria parecido com isto:

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 é incrível.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top