Como fazer luminárias atualizável em testes de Rails?
-
05-07-2019 - |
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
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.