def test_should_update_post_and_add_1_comment
post = posts(:one)
assert post.update_attributes(:title => 'Homework')
post '/posts/post_comment', :comment => {:post_id=> (:post).id, :comment => "test comment"}
assert :comment, post.comments.last
assert assigns(:comment).valid?
end
Rails - Dúvida teste de integração
11 Respostas
Oi diguix, na verdade, a forma como eu postei já funciona, eu gostaria de saber se foi feito da forma correta. Alterando de acordo com as suas sugestões funcionou da mesma forma.
O que eu gostaria de saber é o seguinte, se a linha 5 está correta, e se os asserts abaixo dela estão fazendo a verificação da forma correta, e, no caso, qual dos dois é o “mais correto”, ou mais adequado.
Vlw! :thumbup:
Olá von.juliano,
eu acredito que as duas formas estão corretas, porém nunca fiz testes em ruby/rails(erro meu…) talvez conseguisse uma boa resposta no grupo do google rails-br,o pessoal lá é bem ativo.
Abs’[]
Cara, seguinte, xo tentar te ajudar hehe
Essa parte do teste só está testando o método update_attributes, do Active Record, então não tem o porquê de testar…
post ‘/posts/post_comment’, :comment => {:post_id=> (:post).id, :comment => “test comment”}
assert :comment, post.comments.last
assert assigns(:comment).valid?
Acredito que a melhor coisa a se fazer neste teste é testar o “comportamento”, ou seja, vc teria que fazer o assert do post se ele foi atualizado, e se um comentário novo foi criado…
Aconselho vc a dar uma lida nos testes prontos criados pelo script/generate Scaffold… eles podem ser um ótimo ponto de partida…
Outro bom material: http://guides.rubyonrails.org/testing_rails_applications.html
Abraço!
Oi tchandy,
<blockquote><div class="quote-author">tchandy:</div><blockquote>
post = posts(:one)
assert post.update_attributes(:title => ‘Homework’)
</blockquote>
Essa parte do teste só está testando o método update_attributes, do Active Record, então não tem o porquê de testar…</blockquote>
Aqui eufaçoo update do titulo, e o assert diz se foi feito corretamente, não é isso? Como devo fazer?
post ‘/posts/post_comment’, :comment => {:post_id=> (:post).id, :comment => “test comment”}
assert :comment, post.comments.last
assert assigns(:comment).valid?
Acredito que a melhor coisa a se fazer neste teste é testar o “comportamento”, ou seja, vc teria que fazer o assert do post se ele foi atualizado, e se um comentário novo foi criado…
Sim, é o que quero fazer, e achei que a forma como fiz era a correta.
Acho que não entendi direito :roll:Bom, tou meio enferrujado no test/unit, mais vamos ver se posso ajudar hehe
Teste para a criação do Comment:
def test_should_create_post
@post = posts(:one)
assert_difference('Comment.count') do
post '/posts/post_comment', :comment => {:post_id=> @post, :comment => "test comment"}
end
assert_redirected_to post_path(@post)
end
Aqui vc está comparando que deve ter uma diferença na contagem de comentários, ou seja, que um novo comentário foi criado, got it?
para o update, pode ser feito algo parecido com isso:
def test_should_update_post
put :update, :id => posts(:one).id, :post => { :title => "Titulo" }
assert_equal "Titulo", assigns(:post).title
assert_redirected_to post_path(assigns(:post))
end
Abraço
Lendo o tutorial, consegui chegar à seguinte solução:
def test_should_add_comment
post '/posts/post_comment', :comment => {:post_id=> posts(:one).id, :comment => "comentario"}
assert assigns(:comment).valid?
assert_redirected_to :action => 'show'
end Esse teste está correto, o que está com um problema que ainda não resolvi é o seguinte:
def test_should_update_post
put '/posts/update', :id => posts(:one).id, :title => "titulo"
assert_equal 'titulo', posts(:one).find.title # Erro!
assert_redirected_to post_path(assigns(:post))
endEle reclama que o método find não existe, o qual, pelo que entendi, traria o post alterado para verificação. Se eu usar posts(:one).title, o teste não bate, pois ele compara com o valor original do post. 
Como devo fazer para trazer o valor alterado do post para verificação? Vlw! :thumbup:
utiliza o assigns(:post).title
abraço
tchandy, usando o assigns(:post).title obtenho o seguinte erro:
1) Error:
test_should_update_post(UpdateFirstPostAndAddCommentTest):
NoMethodError: You have a nil object when you didn't expect it! The error occurred while evaluating nil.titleTá complicado! :roll:
cara, acredito que a sua rota esteja errada, tente rodar o seguinte:
def test_should_update_post
put :update, :id => posts(:one).id, :title => "titulo"
assert_equal 'titulo', assigns(:post).title # Erro!
assert_redirected_to post_path(assigns(:post))
end
Caso não funcionar, adiciona ae no Gtalk/Msn que te dou um help…
Abraço!
Não funcionou, dá o erro:
1) Error:
test_should_update_post(UpdateFirstPostAndAddCommentTest):
NoMethodError: undefined method `[]' for :update:SymbolMas o que você está sugerindo é um teste funcional, e não um de integração, correto?
Vou te adicionar no gtalk pra gente conversar, vlw! 