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)
为什么这种自动符号转换为字符串?为什么它会影响哈希的键?
您可以尝试调用"stringify_keys":
assigns(:my_hash).should == { :my_key => :my_value }.stringify_keys
Run Code Online (Sandbox Code Playgroud)
它可能最终成为一个HashWithIndifferentAccess如果Rails以某种方式得到它,并在内部使用字符串键.您可能想验证该类是否相同:
assert_equal Hash, assigns(:my_hash).class
Run Code Online (Sandbox Code Playgroud)
参数始终作为无差别访问类型的哈希处理,因此您可以使用字符串或符号进行检索.如果您将此分配给get或post调用的params散列,或者您可能正在转换.
你可以做的另一件事是冻结它,看看是否有人试图修改它,因为这应该抛出异常:
@my_hash = { :my_key => :my_value }.freeze
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4248 次 |
| 最近记录: |