Criação fácil de objetos somente leitura aninhados

Ao testar alguns objetos que apenas leem dados de outra classe (como modelos de provedores OAuth ou mailers), é necessário ler objetos que possuem uma estrutura muito aninhada e complexa (como o hash OmniAuth). Você poderia criar, OpenStructmas se precisar aninhar um objeto, então não é tão fácil. Para fins de teste, criei algo assim:

class TestStruct < OpenStruct
attr_accessor
:raw_hash

delegate :[], to: :raw_hash

def initialize(hash)
self.raw_hash = hash || {}
end

def method_missing(name, *args, &block)
super unless raw_hash.key?(name)

if raw_hash[name].is_a?(Hash)
raw_hash
[name] = TestStruct.new(raw_hash[name])
else
raw_hash
[name]
end
end
end

Ele fornece uma estrutura somente leitura que pode ser facilmente usada em seus testes como provedor de dados.