2013-06-27 47 views
2

我有一個控制器操作,我將哈希分配給實例變量。在我的rspec測試文件中,我使用分配來測試它的實例變量分配給我期望的值。出於某種原因,分配給我一個字符串鍵的散列。如果我在控制器中打印實例變量,我有符號鍵rspec指定將散列鍵轉換爲字符串

請找到下面的代碼。它被簡化了。

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

的[不需要的符號到散列鍵的字符串的轉換(可能重複http://stackoverflow.com/questions/4348195/unwanted-symbol-to-string γ變換-的哈希鍵) –

回答

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" 
相關問題