rspec将转换哈希键分配给字符串

时间:2013-06-27 20:43:47

标签: ruby-on-rails hash rspec

我有一个控制器动作,我正在为实例变量分配一个哈希。在我的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"}

请帮助我理解为什么会这样做。

1 个答案:

答案 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"