• Nenhum resultado encontrado

T ESTES F UNCIONAIS

No documento APRENDENDO RUBY ON RAILS (páginas 78-82)

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.

No documento APRENDENDO RUBY ON RAILS (páginas 78-82)

Documentos relacionados