Use o método save! ao escrever seus testes

03/06/07

Toda vez que você estiver escrevendo um teste — seja ele qual for — e tiver que chamar o método save, opte pelo método save!. A diferença entre eles é que o primeiro retorna true ou false em caso de sucesso ou falha, respectivamente. Já o segundo, irá disparar a exceção ActiveRecord::RecordInvalid, caso o modelo seja inválido em relação às suas regras de validação.

Aplicado aos testes, a vantagem do método save! está na dependência de alguma alteração do modelo para testar uma outra situação. Imagine o seguinte modelo:

class User < ActiveRecord::Base
  validates_length_of :password,
    :minimum => 4,
    :message => 'A senha deve ter no mínimo 4 caracteres'
 
  attr_accessor :password
end

Já o teste irá validar se um usuário pode se logar com um cookie expirado.

def test_should_fail_expired_cookie_login
  user = users(:quentin)
  user.remember_me
  user.remember_token_expires_at = 5.minutes.ago
  user.save
 
  @request.cookies["auth_token"] = cookie_for(:quentin)
  get :index
  assert !@controller.send(:logged_in?)
end

Ao executá-lo, ele falharia porque o atributo password não foi definido e o método validates_length_of invalidaria nosso modelo, só que você não iria ter nenhuma indicação de que esse foi o motivo. Neste caso, se você trocar a linha user.save por user.save!, uma exceção seria disparada, indicando qual validação não passou. No modelo você poderia utilizar o seguinte código para validar o modelo:

class User < ActiveRecord::Base
  validates_length_of :password,
    :minimum => 4,
    :message => 'A senha deve ter no mínimo 4 caracteres',
    :if => :require_password?
 
  attr_accessor :password
 
  private
    def require_password?
      !password.blank?
    end
end

Comentários #



Deixe um comentário




Este blog usa o Gravatar.


Não é aceito código HTML:
adicione-o no pastie.caboo.se ou paste.milk-it.net e poste apenas o link.

Se este é seu primeiro comentário, ele terá que ser aprovado antes de ser exibido.