2017-09-21 9 views
0

を通じて私はこのような関係モデルを通じて多くを持っている必要がありますか? ので、私のテストで:RSpecのはhas_manyの#<ActiveRecordは::協会:: CollectionProxy>

let!(:physician) { create(:physician) } 
let!(:patients) { create_list(:patients, 2) } 

と私はこのでした:私は、私はそれが通過する期待していますが、それは失敗し、この

expect(physician.as_json).to eq({ 
    "id" => physician.id, 
    "name" => physician.name, 
    "patients" => physician.patients 
}) 

で生成されたJSONをテストしたい

before { physician.patients << patients } 

をこのため#<ActiveRecord::Associations::CollectionProxy>

で確認しましたこのことにより:

physician.patients == patientstrue

は、あなたが私を助けていただけませんされた結果、私はここで何かが足りないのですか?ただcreate_listへの鍵を渡し医師と患者をリンクする

+2

'physician.patients'はレコードの集合です。予想される** jsonデータ**と等しくはありません。これを書くには複数の方法がありますが、基本的にテストは間違っています。** json形式**を何とか定義して、期待される結果が得られるようにする必要があります。 –

+1

'#as_json'という名前にもかかわらず、JSONではなく、シリアライズ可能なハッシュが返されます。そうでなければあなたのコメントは@TomLordにスポットです – max

+0

ありがとう@TomLord私はすべてのあなたのコメントで私のケースを解決することができた。 – nrmb

答えて

1

let!(:patients) { create_list(:patients, 2, physician: physician) } 

それともとしてそれを宣言することができます。

let(:physician) { create(:physician, patients: build_list(patients: 2)) } 

しかし@TomLordで述べたように、テスト自体がまだ壊れています。あなたは結果のハッシュをテストする必要がある - それはシリアル化されたハッシュに変換させます関連付けを含むものとして:直列化への各変更がテストを中断しますよう

{ 
    "id" => 1, 
    "name" => "Dr Suess", 
    "patients" => [ 
    { 
     "id" => 1, 
     "name" => "The Cat in The Hat" 
    }, 
    { 
     "id" => 2, 
     "name" => "The Grinch" 
    }, 
    ] 
} 

eqで正確な出力をテストすることは最適ではありません。

describe '#as_json' do 
    let!(:physician) { create(:physician) } 
    let!(:patients) { create_list(:patients, 2) } 
    subject(:serialized) { physician.as_json } 

    it { should include({ 
     "id" => physician.id, 
     "name" => physician.name 
    }) } 
    it "includes the patients" do 
     expect(serialized["patients"].length).to eq patients.length 
     expect(serialized["patients"]).to include patients.first.as_json 
     expect(serialized["patients"]).to include patients.last.as_json 
    end 
end 

明示的physician.as_json(include: :patients)との関連を含める必要があるとして、あなたはこの仕様に障害が発生した場合as_jsonメソッドをオーバーライドしていない限り:代わりにあなたが存在しなければならないかを指定するためにinclude matcherを使用することができます。

+0

as_jsonをオーバーライドすることは、最初は非常に良い解決策ではありません。一般的なアプローチを考え直すことをお勧めします。 https://robots.thoughtbot.com/better-serialization-less-as-json – max

関連する問題