Testando métodos privados e protegidos no Ruby
17/06/08
Se você precisa testar métodos privados e/ou protegidos, faça isso de uma maneira elegante, sem se enrolar à toa.
Imagine que você tenha uma classe como esta:
class Emo
private
def deny
"i'm not a emo! i'm from uk!"
end
protected
def cut_wrists
"oh god! nobody loves me! i'm gonna cut my wrists!"
end
end
Para testar estes métodos, você pode usar o método send.
require "test/unit"
class TestEmo < Test::Unit::TestCase
def setup
@emo = Emo.new
end
def test_should_cut_wrists
assert_equal @emo.send(:cut_wrists), "oh god! nobody loves me! i'm gonna cut my wrists!"
end
def test_should_deny_condition
assert_equal @emo.send(:deny), "i'm not a emo! i'm from uk!"
end
end
Uma dica rápida, mas que nem todos conhecem. Simples e muito, muito elegante!
Update: Ah, isso deixará de funcionar no 1.9 (você terá que usar o método send!), mas você pode corrigir isso quando ele for lançado, pois os testes que você escreve pegarão tal erro, certo? :)
Update 2: Quando o comportamento do send realmente mudar, acho que algo como isso irá resolver a situação (embora não tenha testado).
class Object
def send(*args)
send!(*args)
end
end
- Permalink
- Trackback
- Feed dos comentários
- Ao som de: Foo Fighters – New Way Home

Comentários #
Muito bom o post :)
Adorei o "tema" do exemplo :)
Matou um problema bicho! Mto bom mesmo!
Muuito elegante mesmo! Mas, faltou dizer se você é Emo ou não! :P
Object#send salva vidas muitas vezes mas testes unitários em OO deveriam focar na classe e não no método. Testar métodos privados pode inciar que voc6e está quebrando a abstração principal…
http://fragmental.tw/2008/01/08/please-do-not-break-into/
[]s
Phillip, embora concorde com o seu argumento, existem momentos que *preciso* testar métodos privados/protegidos.
Tomemos como exemplo um sistema de autenticação no Rails. Meus métodos de verificação estão como
privateno "Application.rb" pois eles devem estar disponíveis apenas para controllers e views, e não podem ser identificados como rotas.Neste caso, faz todo o sentido eu escrever testes unitários para os métodos que compõe a classe
Application(logged?oucurrent_user, por exemplo), pois não necessariamente eles possuem uma abstração principal.Faz sentido? Como você faria seus testes neste caso?
Quando caio nesse seu problema uma solução que eu sempre uso é: http://pastie.org/217489
Deixe um comentário