Vamos agora realizar alguns testes funcionais para aferir o funcionamento do nosso controller e das views de eventos. É importante lembrar que apesar de haver a distinção entre testes de unidade (que testam o modelo de dados) e testes funcionais (direcionados para testes no controller), é perfeitamente possível fazer testes funcionais que realizem manipulações no banco de dados.
Abra o arquivo de testes test/functional/eventos_controller_test, que deve estar assim: require 'test_helper'
class EventosControllerTest < ActionController::TestCase # Replace this with your real tests.
def test_truth assert true end
end
Assim como no arquivo de testes de unidade, esse arquivo já contém um método de teste, porém este teste não faz absolutamente nada e pode ser excluído.
Testando as Exibições
Vamos começar inserindo um teste que testa simplesmente se a view index é encaminhada para o usuário: require 'test_helper'
class EventosControllerTest < ActionController::TestCase
def test_should_get_index get :index
assert_response :success end
end
O método http GET faz uma solicitação ao servidor pelo index e a nossa primeira asserção é feita não mais com o assert, mas com o assert_response, que verifica a resposta dada pelo servidor (neste caso testamos se a resposta e :success, ou seja, a view foi aberta)
Ainda complementando este teste, podemos ver se a lista de eventos foi carregada do banco - para isso utilizaremos o assings. Assigns é um método auxiliar (um helper) disponível para os testes que pode ser utilizado para acessar todas as variáveis de instância definidas na ação solicitada. Com este acréscimo nosso teste fica assim:
require 'test_helper'
class EventosControllerTest < ActionController::TestCase def test_should_get_index
get :index
assert_response :success
Desta vez utilizamos o assert_not_nil para assegurar que a variável de instância que armazena os dados vindos do banco não está vazia.
No nosso próximo teste funcional, vamos verificar a ação show do controller de eventos. require 'test_helper'
class EventosControllerTest < ActionController::TestCase def test_should_get_index get :index assert_response :success assert_not_nil assigns(:eventos) end def test_should_show_evento
get :show, :id => eventos(:palestra_rails).id assert_response :success
end
end
Mais uma vez usamos o método get para solicitar uma view, só que neste caso passamos um id como parâmetro. Repare que buscamos dinamicamente o id da fixture cuja identificação é “palestra_rails”.
Na sequencia, usamos o assert_response para assegurar que a view foi encaminhada com sucesso.
Testando a inserção de dados
Vamos agora fazer alguns testes relacionados à inserção de dados. Primeiro, vamos escrever um teste simples para saber se a view “new” é encaminhada com sucesso:
Logo em seguida, vamos fazer um teste que tenta cadastrar um novo evento e verifica duas coisas: Se o novo dado foi registrado no banco e se o sistema redirecionou para a página que exibe o novo evento recém-criado.
Com os novos testes, o nosso arquivo deverá estar assim: require 'test_helper'
class EventosControllerTest < ActionController::TestCase def test_should_get_index get :index assert_response :success assert_not_nil assigns(:eventos) end def test_should_show_evento
get :show, :id => eventos(:palestra_rails).id assert_response :success end def test_should_get_new get :new assert_response :success end def test_should_create_evento assert_difference('Evento.count') do
post :create, :evento => {:titulo => "Novo Evento"} end
assert_redirected_to evento_path(assigns(:evento)) end
end
Neste útimo exemplo empregamos dois novos tipos de asserções. Primeiro, utilizamos o “assert_diference”. O assert_difference cria um bloco dentro do qual realizamos manipulação no banco, e no final ele avalia se houve diferença no número de registros no banco de dados antes e depois desta manipulação.
Depois verificamos através do assert_redirected_to se a view show foi encaminhada para mostrar os dados do evento criado.
Testando a edição de dados
De modo similar aos testes de inserção de dados, onde primeiro verificamos se a view é enviada e depois verificamos se os dados foram gravados no banco, vamos agora testar de a view “edit” é encaminhada para o usuário e se o dado é atualizado no banco pela ação “update”.
Nossos novos testes ficarão assim: require 'test_helper'
class EventosControllerTest < ActionController::TestCase def test_should_get_index get :index assert_response :success assert_not_nil assigns(:eventos) end def test_should_show_evento
get :show, :id => eventos(:palestra_rails).id assert_response :success end def test_should_get_new get :new assert_response :success end def test_should_create_evento assert_difference('Evento.count') do
post :create, :evento => {:titulo => "Novo Evento"} end
assert_redirected_to evento_path(assigns(:evento)) end
def test_should_get_edit
get :edit, :id => eventos(:palestra_rails).id assert_response :success
end
def test_should_update_evento
put :update, :id => eventos(:palestra_rails).id, :evento => {:titulo => "Titulo atualizado" } assert_redirected_to evento_path(assigns(:evento))
end
end
O primeiro teste - test_should_get_edit, utiliza o método get passando como parâmetro o id do primeiro registro do banco de dados de teste (conforme havíamos configurado no arquivo de fixtures) para carregar solicitar a view edit. O assert_response verifica se esta view foi encaminhada corretamente.
Testando a exclusão de dados
Finalmente, vamos fazer um último teste que tenta excluir um registro do banco e verifica se o registro é de fato excluido e se a view de eventos é encaminhada. Nosso teste ficará assim:
require 'test_helper'
class EventosControllerTest < ActionController::TestCase def test_should_get_index get :index assert_response :success assert_not_nil assigns(:eventos) end def test_should_show_evento
get :show, :id => eventos(:palestra_rails).id assert_response :success end def test_should_get_new get :new assert_response :success end def test_should_create_evento assert_difference('Evento.count') do
post :create, :evento => {:titulo => "Novo Evento"} end
assert_redirected_to evento_path(assigns(:evento)) end
def test_should_get_edit
get :edit, :id => eventos(:palestra_rails).id assert_response :success
end
def test_should_update_evento
put :update, :id => eventos(:palestra_rails).id, :evento => {:titulo => "Titulo atualizado" } assert_redirected_to evento_path(assigns(:evento))
end
def test_should_destroy_evento
assert_difference('Evento.count', -1) do
delete :destroy, :id => eventos(:palestra_rails).id end
assert_redirected_to eventos_path end
end
Como você pode notar, este teste faz a solicitação para o servidor utilizando o método http DELETE, enviando como parâmetro o id do primeiro registro do banco de dados de teste.
Utilizando um bloco assert_diference, primeiro verificamos se após a manipulação o banco de dados fica com um registro a menos que antes. Na sequencia, verificamos se a view de eventos é encaminhada corretamente através do assert_redirectes_to.