АГА! Это происходит не из-за 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, но просто для сравнения я оставил его таким же)
Дополнительные пояснения см. в этой статье: hashie.html" rel="nofollow noreferrer">http://ryanogles.by/rails/hashie/rspec/testing/2012/12/26/rails-controller-specs-dont-always-play-nice-with-hashie .html
person
mltsy
schedule
21.07.2015