在我的rspec测试中,我被困了几天。然后我发现问题是使用符号而不是字符串
user_response = JSON.parse(response.body, symbilize_names: true)
expect(user_response[:email]).to eql(@user.email)
上述代码始终失败,因为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"}
在上面的案例中使用符号和字符串有什么区别?
答案 0 :(得分:5)
在Ruby中使用Hash时,任何对象(如字符串或符号)都可以用作键。但是,:email
和"email"
是不同的对象,因此要查找对象,必须使用与存储值相同的对象。
你可能会感到困惑的是,Rails在某些地方使用了HashWithIndifferentAccess
。这是一个自定义哈希,其中密钥:foo
和"foo"
被认为是相同的。这允许您使用例如params[:user]
和params["user"]
可以互换,但这不是一般情况。
当Stefan发现时,字符串被用于解析的JSON对象中的键的原因只是选项中的一个小错误:symbilize_names
它应该是symbolize_names
}。
答案 1 :(得分:4)
这实际上与符号或字符串本身无关。你有一个哈希。该哈希包含密钥'email'
的值。它不包含密钥'foobar'
或42
或:hello
或[1, 2, 3]
或:email
的值。例如,如果您询问其中一个的值,则会得到默认值,默认为nil
。
这与符号或字符串无关。您只是询问哈希值是否存在不存在的键。哈希中没有键:email
,因此你得到默认值。
答案 2 :(得分:2)
符号和字符串只是不同类型的对象。与'5'
和5
相同。他们表面上看起来相似,但实际上它们并不相关。
在上面的案例中使用符号和字符串有什么区别?
在您的情况下,您的数据结构包含字符串键,并且不包含符号键。就这么简单。