Programação Web Aula 10 - Testes, Javascript, Ajax Bruno Müller Junior Departamento de Informática UFPR 28 de Abril de 2014
1 Ambientes de Execução 2 Testes Um exemplo Acrescentando Validação Validação Especíca do CPF Teste da validação Especíca do CPF Teste de Unidade Executar o teste 3 Ajax Criando a busca Busca usando Ajax Arquivo de renderização Mais informações
Ambientes de Execução Uma aplicação rails é criada já com três ambientes (environment): desenvolvimento, testes e produção. Cada uma tem um BD sicamente diferente. As diferenças entre eles podem ser vistas no arquivo config/database.yml.
Testes Uma das virtudes do framework Rails é possibilidade de usar ambiente(s) de testes. Existem várias suites de testes, cada uma instalada como uma gem. Exemplo: cucumber http://cukes.info/ A maioria das suites implementa TDD Test Driven Development. Testes de unidade: para modelos. Testes Funcionais: para views. Testes de Integração: para controllers. Um bom guia: http://guides.rubyonrails.org/testing.html
Um exemplo Um exemplo Como exemplo, considere uma aplicação que deve receber dados de pessoas, em especial CPF. O CPF digitado deve ser testado para vericar se é válido. Criando o exemplo: > rails new cpf; cd cpf > rails g scaffold Pessoa cpf:string nome:string \ sobrenome:string data_nascimento:date > rake db:migrate
Acrescentando Validação Acrescentando Validação Validação de presença: Insere direto no Modelo (app/models/pessoa.rb) validates_presence_of :cpf Validação de Formato: XXX.XXX.XXX/XX validates :cpf, format: { with: /\d{3}.\d{3}\.\d{3}\-\d{2}/, message: "inválido!"} validates é uma helper function com um monte de funcionalidades: http://guides.rubyonrails.org/ active_record_validations.html#validation-helpers
Validação Especíca do CPF Validação Especíca do CPF A validação anterior inclui helpers genéricos. No CPF, há um cálculo de DV que tem de ser calculado. Para incluir: Indicar o módulo de validação (no modelo): include ActiveModel::Validations validates_with CpfValidator Criar o arquivo de validação em lib/validators/cpf_validator.rb: http://www.inf. ufpr.br/bmuller/ci320/10/cpf_validator.rb. Acrescentar diretório (lib/validators) à aplicação em config/application.rb config.autoload_paths += %W(#{config.root}/lib/validators)
Teste da validação Especíca do CPF Teste da validação Especíca do CPF Método 1: Digitar vários cpfs válidos/inválidos (Método antigo). O problema aqui é como (re)testar tudo se for feita uma mudança no cálculo. Método 2: Usar o modelo de testes do Rails. rake test Alguns testes já foram incluídos na geração da aplicação (new) e na geração do modelo ou do controlador ou da view. Estes testes estão no diretório test, que tem os seguintes subdiretórios: > ls test/ controllers fixtures helpers integration mailers models test_helper.rb
Teste de Unidade Teste de Unidade 1 Criar a xture (massa de dados para testes) em test/fixture 2 Já existe o arquivo pessoas.yml. 3 Criar massa de dados com cpfs válidos E inválidos. (http: //www.inf.ufpr.br/bmuller/ci320/10/pessoas.yml.) 4 Criar o teste no modelo test/unit/pessoa_test.rb (http: //www.inf.ufpr.br/bmuller/ci320/10/pessoa_test.rb.) 5 Para detalhes, veja http://guides.rubyonrails.org/ testing.html#unit-testing-your-models 6 assert: denição to state or declare positively and often forcefully or aggressively
Executar o teste Executar o teste 1 Preparar e inicializar o banco de dados do ambiente test 1 rake db:test:prepare - executa migraçõees pendentes e carrega o esquema do banco de dados do ambiente test 2 rake db:test:load - recria o banco de dados de teste a partir do arquivo db/schema.rb 2 Executar o(s) Unit Test('s) 1 Para um teste especíco: ruby -Itest test/unit/pessoa_test.rb 2 Para executar todos os testes de unidade: rake test:units 3 Para executar toda a suite de testes: rake test
Ajax Para demonstrar o uso de Ajax, vamos incrementar o exemplo anterior com uma busca na própria janela de listagem. Prelúdio: editar app/view/pessoas/index.html.erb; copiar o <table>.. </table para o arquivo _tabela_pessoas.html.erb. substituir no index por: <%= render 'tabela_pessoas' %> A alteração foi só perfumaria. A aplicação funciona normalmente.
Criando a busca Criando a busca Para fazer a busca (por nome), precisamos de: Um campo para a busca (form_tag, e incluí-lo no _index.html.erb. Deixei um pronto em (http://www.inf.ufpr.br/bmuller/ CI320/10/index.html.erb.) Observe que o nome do parâmetro é :nome Acrescentar uma ação no controlador baseado neste parâmetro. Deixei um pronto em (http://www.inf.ufpr.br/bmuller/ CI320/10/pessoas_controller.rb.) O campo de busca funciona. Verique. Só não usa Ajax.
Busca usando Ajax Busca usando Ajax O último passo é usar Ajax para renderizar somente a partial _tabela_pessoas.html.erb (e não toda a view). 1 indicar que a busca deve usar Ajax: <%= form_tag(pessoas_path, { :method => :get, :remote => true }) do %> 2 Criar um <div> sobre o qual deverá ocorrer a renderização. <div id=''ajax_load''> <%= render 'tabela_pessoas' %> </div> 3 Indicar no controller que é para responder Javascript: respond_to do format format.html # index.html.erb format.js format.json { render json: @pessoas } end
Arquivo de renderização Arquivo de renderização O último passo é criar o arquivo JS que deve responder à requisição. Como o controller que responde JS é o index, o arquivo é o app/views/pessoas/index.js.erb: $('div#ajax_load').html('<p>procurando, aguarde...</p>') $('div#ajax_load').html('<%= escape_javascript(render %"tabela_pessoas") %>') Alternando o :remote entre true e false, teremos renderização usando Ajax (respond_to... format.js) ou HTML (respond_to... format.html) http: //api.rubyonrails.org/classes/actionview/helpers/ JavaScriptHelper.html#method-i-escape_javascript
Mais informações Mais informações O objetivo não foi esgotar o assunto, mas conceituar. Assim como existe a variável params, também existem outras. Destaque à variável session, que é capaz de preservar informações entre interações. Muito útil para saber as funcionalidades disponíveis para um usuário (no caso de login/senha). Aulas muito interessantes: railscasts (pago, mas tem partes livres). O último trabalho pede login/senha. Tem vários tutoriais, como por exemplo http: //rails-4-0.railstutorial.org/book/modeling_users.