Como testar métodos privados?
13/03/2008
Hoje, no blog Nome do Jogo de Carlos Brando, saiu um post falando sobre como testar métodos privados. Uma outra maneira é tornar todos os métodos públicos, sem adicionar nenhum outro.
Basta adicionar o trecho abaixo em seu arquivo test/test_helper.rb ou spec/spec_helper.rb
def turn_public_methods clazz
clazz.class_eval do
private_instance_methods.each { |instance_method| public instance_method }
private_methods.each { |method| public_class_method method }
end
end
Um exemplo:
#File spec/my_model_spec.rb
require File.dirname(__FILE__) + '/../spec_helper'
describe MyModel do
before(:each) do
turn_public_methods(MyModel)
@mymodel = MyModel.new
end
describe "Verify a private method" do
@mymodel.private_method_name.should_not be_nil
end
end
Atualização #1
Conforme o comentário de Rafael Muller, resolvi adicionar a comparação apresentada por Evan Phoenix e esta solução.
### Versão do Evan
class NinjaTest < Test::Unit::TestCase
def test_should_punish_sloppy_coders
@ninja = Ninja.new
def @ninja.flog_publicly(*args)
kill(*args)
end
assert_equal ‘3 victims are no longer with us.’, @ninja.flog_publicly(3)
end
end
### Versão do Tino
class NinjaTest < Test::Unit::TestCase
def setup
turn_methods_public(Ninja);
end
def test_should_punish_sloppy_coders
@ninja = Ninja.new
assert_equal ‘3 victims are no longer with us.’, @ninja.kill(3)
end
end
Para mim, um pouco mais limpo o teste, mas gosto é gosto!







Fala Tino,
Quando eu posso colocar a solução de adicionar um método ao objeto em um setup do teste, eu prefiro a idéia do Evan, acho que fica melhor não alterar nada na classe…
Ahh, você escreveu “Uma outra maneira é tornar todos os métodos privados, sem adicionar nenhum outro.”, não seria “públicos” ali?
Grande abraço
Mueller,
Obrigado pela correção e dei uma atualizada no post, adicionando uma comparação entre os códigos.
Grande Abraço!