constantes .clone e Ruby

Escrevendo um aplicativo Sinatra simples para simular um serviço da web, decidi usar rspec e um arquivo yaml simples para armazenar os dados de teste necessários.

O arquivo yaml é carregado como o FIXTURES constante de hash na minha spec_helper.rb :

require 'yaml'
FIXTURES
= YAML.load_file('config/fixtures.yml')

Então, para acionar casos de teste específicos, decidi pegar uma cópia de um hash específico em FIXTURES e alterar algo nessa cópia:

foo_hash = FIXTURES['some']['hash']
foo_hash
['a_key'] = 'new string'

Mas então, como as rotas sinatra usam o mesmo arquivo yaml para pegar os dados para retornar e como as constantes são tratadas no Ruby ( http://www.ruby-forum.com/topic/67675 ) o conteúdo do hash FIXTURES mudaria também.

Para evitar isso, pode-se usar o método clone :

foo_hash = FIXTURES['some']['hash'].clone

O método clone produz uma cópia totalmente separada do hash, resolvendo assim o problema.

Mistério resolvido.

Sintomas: os testes rspec executados em ordem aleatória produzem resultados diferentes. No entanto, a reutilização de uma semente aleatória específica produzirá os mesmos resultados continuamente.