2017-12-21 8 views
0

フロントエンドとやり取りしてdbに投稿するアプリケーションを作成しています。私の削除エンドポイントでは、端末ではレコードが削除されたものとして表示されます。しかし、私のテストでは、それはまだそこに表示されます。ここに私のテストがあります...Railsはターミナルのレコードを削除しますが、RSpecにはまだレコードが表示されています

it 'can delete just one favorite leaving the rest' do 
    user = create(:user) 
    vid = video_payload 
    vid_2 = video_payload_2 

    post "/api/v1/users/#{user.id}/favorites/#{vid[:id]}", params:video_payload 
    post "/api/v1/users/#{user.id}/favorites/#{vid_2[:id]}", params:video_payload_2 

    expect(user.favorites.length).to eq(2) 
    expect(user.favorites[1].video_id).to eq(vid_2[:id].to_i) 

    delete "/api/v1/users/#{user.id}/favorites/#{vid[:id]}" 

    expect(user.favorites.length).to eq(1) 
    expect(user.favorites[0].video_id).to eq(vid_2[:id].to_i) 
end 

削除後の期待は失敗です。

def destroy 
    # user = User.find(params[:id]) 
    # favorite = Favorite.find_by(user_id: params[:id], video_id: params[:video_id]) 
    # render json: Favorite.delete(favorite.id) 
    user = User.find(params[:id]) 
    favorite = Favorite.find_by(user_id: params[:id], video_id: params[:video_id]) 
    user.favorites.delete(favorite) if favorite 
    end 

私は

好きなユーザーと別のテーブル間の結合である(コメントアウトしてコメントを外し)レコードを削除するために、これらの二つの方法を試してみました。それは多対多の関係です。私は他のテーブルやユーザーに依存して破壊し、それと同じエラーが発生しないようにしようとしました。あなたのスペックで

+1

あなたは念のためにあなたの仕様でユーザーオブジェクトを再読み込みしようとしたことがありますか? 'user.reload.favorites.length'のようなものを試すことができます。 –

+0

@DerekHopperそれはトリックでした!ありがとうございました。あなたが答えを提出すれば、私はそれを受け入れてクレジットを得ることができます:D私はそれをターミナルで行いましたが、それがテストで成し遂げられることを認識しませんでした。私は今それを読んで行くつもりです。再度、感謝します。 –

答えて

3

、あなたはこれを持っている:

expect(user.favorites.length).to eq(1) 

ではなく、これを試してみてください。お気に入りの長さを確認する前に、ユーザーオブジェクトをリロードしてください。

expect(user.reload.favorites.length).to eq(1) 

Railsは、関連付けを追跡するためにActiveRecord::Associations::CollectionProxyを使用します。初めてフェッチすると、結果がキャッシュされます。 reloadは新鮮な結果を得られるようにします。

参照してください:http://api.rubyonrails.org/classes/ActiveRecord/Associations/CollectionProxy.html

関連する問題