2013-06-27 9 views
2

컨트롤러 작업을 통해 인스턴스 변수에 해시를 할당하고 있습니다. 내 rspec 테스트 파일에서 인스턴스 변수가 내가 예상 한 값에 할당되어 있는지 테스트하기 위해 할당을 사용하고 있습니다. 어떤 이유로, assigns는 문자열 키가있는 해시를 제공합니다. 컨트롤러에 인스턴스 변수를 인쇄하면 심볼 키가 표시됩니다.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은 일반 레일 테스트/유닛 헬퍼에서 할당을 받고 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" 
관련 문제