2016-04-13 5 views
3

これは非常に簡単な質問ですが、私はこれに対する解決策を見つけることができません。それは3日間続いた。助けてください。インデックスのinstance_variableのRSpec

だから私は、だから私は私のコードはhttps://www.relishapp.com/rspec/rspec-rails/docs/controller-specsから基づいてい

it "assign all normal users to @users" do 
    users = User.normal.all 
    get :index 
    expect(assigns(:users)).to eq(users) 
end 

私users_controller_spec.rbでこれを持って

users_controller.rb

def index 
    @users = @users.normal.order(:name).page params[:page] 
end 

でこれを持っています。

端末でrspecを実行すると、これが出力されます。

Diff: 
    @@ -1,4 +1,4 @@ 
    -[#<User:0x00000004aa32b0 
    +[#<User:0x00000004a085a8 
     id: 2, 
     name: "Christian Galamay", 
     admin: false, 
    @@ -20,7 +20,7 @@ 
     updated_at: Wed, 13 Apr 2016 01:46:17 UTC +00:00, 
     role: "Normal", 
     avatar: nil>, 
    - #<User:0x00000004aa2ea0 
    + #<User:0x000000049dbd78 
     id: 3, 
     name: "Grace Sojor", 
     admin: false, 
    @@ -42,7 +42,7 @@ 
     updated_at: Wed, 13 Apr 2016 01:46:17 UTC +00:00, 
     role: "Normal", 
     avatar: nil>, 
    - #<User:0x00000004aa2ab8 
    + #<User:0x000000049db760 
     id: 4, 
     name: "Karl Pandacan", 
     admin: false, 

出力には、ユーザーの後の16進数を除いてすべての値が同じであることが示されます。だから私の質問は、(1)2つのActiveRecordを比較するには、ユーザーの後ろの16進数が含まれている理由です(2)ユーザーの16進数を無視するために使用するメソッドまたは関数はありますか。あなたは

答えて

2

出力がやや誤解を招くおそれがあります。 2つのものは関係オブジェクトであり、2つのActiveRecord::Relationオブジェクトの間の==は生成されたSQLを比較することによって機能します。あなたのケースでは、関係は等しくありません:コントローラーではページ設定して注文を設定しています。

to_sの2つのオブジェクトの出力を比較すると、Rspecは役立ちますが、これはクエリの結果(実際には同じオブジェクト)を比較することになります。したがって、その文字列で唯一の違いが見つかります出力はオブジェクトIDです。これは部分的に運があります - 順序句なしで、オブジェクトは別の順序で返されている可能性があります。明示的に言えば、表示されているdiff出力はあなたを助けるためのものですが、それはrspecがどのように比較を行ったかを意味するものではありません。何がしたいことは、クエリの結果を比較する場合

、あなたはそれを行うためにto_aを使用することができます:あなたが順序を気にしない場合は

expect(assigns(:users)).to eq(users.to_a) 

あなたも行うことができ

expect(assigns(:users)).to match_array(users) 

これは若干異なるテストです.dbが結果を返すことを決定した場合は、上記のように失敗することはありません。

+0

私はすでにto_aを追加してテストします:) –

3

あなたは、単にユーザーの配列の代わりに、アクティブなレコード関係を確認することができますありがとうござい

expect(assigns(:users).to_a).to eq(users.to_a) 
2

あなたの配列はあなたではなく価値の平等以来よりも参照の等価を比較しているので、しかし、あなたのspecが失敗して、値の等価ですあなたのコントローラは、あなたの仕様とは別の変数にユーザーを読み込んでいます。

as_jsonを使用して、コレクションの値を比較してみてください。

expect(assigns(:users).as_json).to eq(users.as_json) 
+0

説明が正しくありません: 'eq'マッチャーは' == 'を使って' equal? 'を比較します –

+0

私はto_aを追加しようとしています。ありがとう:) –