Rails - Dúvida teste de integração

Pessoal, estou tentando criar um teste que altera um post e então adiciona um comentário a ele. O código é o seguinte:

[code]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[/code]Acho que até o primeiro assert está ok, mas não sei se a linha seguinte (5) está correta. Se ela estiver, as tentativas de verificar se o comentário foi adicionado estão corretas? Obrigado! :thumbup:

-editado -
-> na linha 2 substitua o nome da variavel post, para não confundir com o o método post da linha 5(o primeiro da linha)
-> na linha 5 utilize o post.id ao invés de b.id[/b].

tente ai e diga se funcionou.

abs’[]

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…

[quote]
post ‘/posts/post_comment’, :comment => {:post_id=> (:post).id, :comment => “test comment”}
assert :comment, post.comments.last
assert assigns(:comment).valid? [/quote]

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,

[quote=tchandy][quote]
post = posts(:one)
assert post.update_attributes(:title => ‘Homework’)
[/quote]
Essa parte do teste só está testando o método update_attributes, do Active Record, então não tem o porquê de testar…[/quote]
Aqui eufaçoo update do titulo, e o assert diz se foi feito corretamente, não é isso? Como devo fazer?

[quote=tchandy][quote]
post ‘/posts/post_comment’, :comment => {:post_id=> (:post).id, :comment => “test comment”}
assert :comment, post.comments.last
assert assigns(:comment).valid? [/quote]
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…[/quote]
Sim, é o que quero fazer, e achei que a forma como fiz era a correta. :frowning: 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:

[code] 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 [/code]

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

Tou meio enferrujado com o Test/Unit, ultimamente só estou usando o RSpec, então se alguém puder postar um código melhor…

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. :frowning:

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! :smiley: