Emm*_*ali 1 ruby rspec ruby-on-rails
在我的rspec测试中,我被困了几天.然后我发现问题是使用符号而不是字符串
user_response = JSON.parse(response.body, symbilize_names: true)
expect(user_response[:email]).to eql(@user.email)
Run Code Online (Sandbox Code Playgroud)
由于某些原因user_response[:email]返回以上代码总是失败nil
但是当我改变它以user_responce['email']通过测试
使用byebug进行调试以检查user_response的值
(byebyg) user_response
{"id"=>1, "email"=>"enola@bauch.ca", "created_at"=>"2017-08-30T14:22:43.597Z", "updated_at"=>"2017-08-30T14:22:43.597Z"}
Run Code Online (Sandbox Code Playgroud)
在上面的例子中使用符号和字符串有什么区别?
在Ruby中使用Hash时,可以使用任何对象(如字符串或符号)作为键.但是,:email并且"email"是不同的对象,因此要查找对象,必须使用用于存储值的相同对象.
令你困惑的是Rails HashWithIndifferentAccess在某些地方使用了a .这是一个自定义的哈希,其中键:foo和"foo"被认为是相同的.这允许您使用例如params[:user]和params["user"]可互换的,但这不是一般情况.
正如Stefan所发现的那样,字符串被用于解析的JSON对象中的键的原因只是选项中的一个小错误:symbilize_names它应该在哪里symbolize_names.
这实际上与符号或字符串本身无关。你有一个哈希值。该散列包含键的值'email'。它不包含键'foobar'or 42or :helloor [1, 2, 3]or的值:email。因此,如果您询问其中之一的值,您会得到默认值,即nil默认值。
这与符号或字符串无关。您只是向哈希询问不存在的键的值。:email哈希中没有键,因此您得到默认值。