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, OpenStruct
mas 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.