AHA! Это происходит не из-за Rails, а из-за Rspec.
У меня была такая же проблема при тестировании значения Hashie::Mash
в спецификации контроллера (но это относится ко всему, что крякает как Hash
)
В частности, в спецификации контроллера, когда вы вызываете assigns
для доступа к переменным экземпляра, установленным в действии контроллера, он не возвращает точно установленную вами переменную экземпляра, а скорее копию переменной, которую Rspec хранит как член HashWithIndifferentAccess
(содержащий все назначенные переменные экземпляра). К сожалению, когда вы вставляете Hash
(или что-либо, что наследуется от Hash
) в HashWithIndifferentAccess
, он автоматически преобразуется в экземпляр того же, о, очень удобного, но не совсем точного класса :)
Самый простой обходной путь - избежать преобразования путем непосредственного доступа к переменной до ее преобразования «для вашего удобства», используя: controller.view_assigns['variable_name']
(примечание: ключ здесь должен быть строкой, а не символом)
Таким образом, тест в исходном посте должен пройти, если он был изменен на:
get 'index'
controller.view_assigns['my_hash'].should == { :my_key => :my_value }
(конечно, .should
больше не поддерживается в новых версиях RSpec, но просто для сравнения я сохранил то же самое)
См. Эту статью для дальнейшего объяснения:
http://ryanogles.by/rails/hashie/rspec/testing/2012/12/26/rails-controller-specs-dont-always-play-nice-with-hashie.html