不需要的符号来转换哈希键的字符串

Zar*_*doz 13 testing unit-testing rspec ruby-on-rails rspec2

当我在我的控制器中分配时

@my_hash = { :my_key => :my_value }
Run Code Online (Sandbox Code Playgroud)

并通过执行测试该控制器

get 'index'
assigns(:my_hash).should == { :my_key => :my_value }
Run Code Online (Sandbox Code Playgroud)

然后我收到以下错误消息:

expected: {:my_key=>:my_value},
got: {"my_key"=>:my_value} (using ==)
Run Code Online (Sandbox Code Playgroud)

为什么这种自动符号转换为字符串?为什么它会影响哈希的键?

cod*_*tim 8

您可以尝试调用"stringify_keys":

assigns(:my_hash).should == { :my_key => :my_value }.stringify_keys
Run Code Online (Sandbox Code Playgroud)


tad*_*man 6

它可能最终成为一个HashWithIndifferentAccess如果Rails以某种方式得到它,并在内部使用字符串键.您可能想验证该类是否相同:

assert_equal Hash, assigns(:my_hash).class
Run Code Online (Sandbox Code Playgroud)

参数始终作为无差别访问类型的哈希处理,因此您可以使用字符串或符号进行检索.如果您将此分配给getpost调用的params散列,或者您可能正在转换.

你可以做的另一件事是冻结它,看看是否有人试图修改它,因为这应该抛出异常:

@my_hash = { :my_key => :my_value }.freeze
Run Code Online (Sandbox Code Playgroud)