2

インスタンス変数にハッシュを割り当てるコントローラーアクションがあります。私のrspecテストファイルでは、割り当てを使用して、インスタンス変数が期待する値に割り当てられていることをテストしています。何らかの理由で、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"}

なぜそれがそうしているのかを理解するのを手伝ってください。

4

1 に答える 1

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"
于 2013-06-27T21:08:56.743 に答える