Teste facilmente métodos privados e protegidos em Ruby

Ao escrever testes de unidade, geralmente deve -se testar a API pública de uma classe. Às vezes, entretanto, pode ser necessário / desejável também testar métodos privados (há muita discussão sobre esse assunto por aí, e eu realmente não quero entrar nisso ;-). Mas, qual é a melhor maneira de testar a unidade de métodos protegidos e privados em Ruby? .

A questão vinculada ao SO contém algumas sugestões. Eu realmente não posso dizer qual deles pode ser o melhor , mas aqui está um fácil que não está listado. Vamos supor que você tenha a seguinte classe:

class Foo
private
def bar
42
end
end

E se você quiser testar o método privado bar, pode simplesmente adicionar o seguinte, por exemplo, à sua classe auxiliar de teste:

class Foo
public *self.private_instance_methods(false)
end

O que isso faz?

  • publicé um método que pega 1..nsímbolos que representam os nomes dos métodos de instância e os torna públicos.
  • self.private_instance_methodsretorna todos os métodos de instância privados de Foo(duh) como uma lista, e o parâmetro booleano indica se devemos ou não incluir métodos herdados (o que não queremos neste caso).
  • O operador splat (o *) descompacta a lista retornada como parâmetros para, publicportanto, tornar todos os métodos privados Foopúblicos. O mesmo funciona com métodos protegidos se você usar protected_instance_methods🙂