Rails – Testes funcionais com cookie

No meu ApplicationController, coloquei um before_filter que verifica se no cookie do usuário tem uma chave e verifico seu valor. No caso de não existir o valor, ou o mesmo for diferente do esperado, eu mando um reset_session e adiciono a chave com o valor. Até aí beleza. Quando fui rodar minha bateria de testes… BOOM! Estourou um monte de erros nos testes funcionais de admin, já que os mesmos adicionam a sessão um usuário que tem regra de admin, como no exemplo abaixo.

...
class Admin::BlogsControllerTest < ActionController::TestCase
  setup do
    @admin = Factory(:user, :role => "admin")
    @request.session[:user_id] = @admin.id
  end
  ...
end

Bastaria adicionar no setup de cada arquivo de teste funcional uma simples linha:

setup do
  ...
  @request.cookies['chave'] = 'valor'
end

Mas pensei comigo mesmo: DRY (Don’t Repeat Yourself). Logo, em meu test/test_helper.rb

...
class ActionController::TestCase
  setup :setting_cookie_version
  def setting_cookie_version
    @request.cookies['_bbsession_version'] = APP_CONFIG['session']['version']
  end
end
...

Nova macro para o shoulda

Então, escrevendo testes para o blogblogs, senti a necessidade de uma macro para verificar se o modelo responde a “validates_confirmation_of”. Fiz e já mandei para a galera da thoughtbot, mas caso eles não aceitem, mas queiram pegar essa macro, pode pegar no meu github. Mas está em um branch separado, então, atenção!

http://github.com/tinogomes/shoulda

Como usar:

should_require_confirmation_of <attributes>  [, :value => "some value"] [, :message => "custom message"]

Exemplo:

class User < ActiveRecord::Base
  validates_confirmation_of :password
  validates_confirmation_of :email, :message => "Please, you wanna confirm your email"
end

class UserTest < Test::Unit::TestCase
  should_require_confirmation_of :password
  should_require_confirmation_of :email, :message => "Please, you wanna confirm your email"
end

PS: O bloco acima não foi testado.


Textmate apenas com o que é necessário

Seguindo sugestão do Luiz…

Você usa o Textmate para desenvolvedor em Rails, então deve estar habituado abrir todas as pastas do projeto, com o famoso:

mate .

Mas isso, quando se tem um projeto muuuuuito grande, a pasta public, log, vendo acabar deixando o Textmate um pouco mais lendo. Para acelerar, eu abro apenas as pastas, exceto as mencionadas anteriormente, então:

mate app/ config/ db/ lib/ script/ test/ README Rakefile

Pra isso, fiz um alias:

alias rmate="mate app/ config/ db/ lib/ script/ test/ README Rakefile"

Mas aí começa a vir novos plugins e gems, que criam arquivos/pastas novas que queremos adicionar ao projeto, like RSpec/Capistrano, então, dá-lhe refactoring no alias.

alias rmate="mate app/ config/ db/ lib/ scrpit/ spec/ \
stories/ test/ README Rakefile Capfile

Agora, estou mudando de projeto, e novas pastas são requeridas e, ao invés de adicionar as pastas/arquivos ao alias, resolvi pensar um pouco mais, então, olha que bonito.

mate $(ls -1 | egrep -v log | egrep -v git | egrep -v public \
| egrep -v vendor | egrep -v tmp | egrep -v doc | egrep -v .DS_Store)
mate $(ls -1 | egrep -v "(log|git|public|vendor|tmp|doc)" | \
egrep -v .DS_Store)

Agora, basta criar uma função no .bashrc e atualizar meu alias para facilitar a vida, então:

_rmate() {
mate $(ls -1 | egrep -v log | egrep -v git | egrep -v public\
 | egrep -v vendor | egrep -v tmp | egrep -v doc | egrep -v .DS_Store)
mate $(ls -1 | egrep -v "(log|git|public|vendor|tmp|doc)" | \
egrep -v .DS_Store)
}

alias rmate="_rmate"

Pronto!


Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

Join 602 other followers