我有一个控制器动作,我正在为实例变量分配一个哈希。在我的rspec测试文件中,我使用assigns来测试它,实例变量被赋值给我期望的值。由于某种原因,assigns给我一个带字符串键的哈希。如果我在控制器中打印实例变量,我有符号键
请找到以下代码。它被简化了。
class TestController < ApplicationController
def test
@test_object = {:id => 1, :value => 2, :name => "name"}
end
end
我的测试文件:
describe TestController do
it "should assign test_object" do
get :test
assigns(:test_object).should == {:id => 1, :value => 2, :name => "name"}
end
end
上述测试失败并显示错误消息
expected: {:id=>1, :value=>2, :name=>"name"}
got: {"id"=>1, "value"=>2, "name"=>"name"}
请帮助我理解为什么会这样做。
答案 0 :(得分:4)
RSpec借用常规Rails测试/单元助手的分配,并使用with_indifferent_access返回assigns(:my_var)
中所请求的实例变量。
Hash#with_indifferent_access
返回哈希的键字符串化版本(深层副本),其副作用是字符串化实例变量哈希的键。
如果您尝试匹配整个哈希值,它将失败,但如果您检查特定键的值,它们是否为符号或字符串,则它会起作用。
也许一个例子有助于澄清:
{:a => {:b => "bravo"}}.with_indifferent_access => {"a"=>{"b"=>"bravo"}}
{:a => {:b => "bravo"}}.with_indifferent_access[:a][:b] => "bravo"