2017-12-21 1 views
0

Ich erstelle eine App, die mit einem Frontend interagieren wird, um es an eine db zu senden. Auf meinem Lösch-Endpunkt wird im Terminal der Datensatz als gelöscht angezeigt. Aber in meinem Test zeigt es sich immer noch wie dort. Hier ist mein Test ...Rails löscht den Datensatz im Terminal, aber RSpec zeigt immer noch den Datensatz an, der dort ist

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 

Die Erwartungen nach dem Löschen sind diejenigen, die scheitern.

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 

Ich habe diese zwei Möglichkeiten versucht, den Datensatz (die kommentiert und die unkommentiert)

Favorit ist eine Verbindungen zwischen Benutzern und einer anderen Tabelle zu löschen. Es ist eine Beziehung von vielen zu vielen. Ich habe es mit dem abhängigen Zerstören an anderen Tischen und Benutzern versucht und ohne immer noch den gleichen Fehler.

+1

Haben Sie versucht, das Benutzerobjekt in der Spec-Nachladen nur um sicher zu sein? Sie können etwas wie 'user.reload.favorites.length' versuchen. –

+0

@DerekHopper Das hat den Trick gemacht! Vielen Dank. Wenn Sie die Antwort einreichen, kann ich sie akzeptieren, damit Sie den Kredit bekommen: D Ich habe das im Terminal gemacht, aber nicht bemerkt, dass es im Test gemacht werden konnte. Ich werde jetzt darüber nachlesen. Danke noch einmal. –

Antwort

3

In der Spec, haben Sie dies:

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

dies stattdessen versuchen. Laden Sie das Benutzerobjekt neu, bevor Sie die Länge der Favoriten überprüfen.

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

Rails verwendet eine ActiveRecord::Associations::CollectionProxy Spur des Vereins zu halten. Wenn Sie es das erste Mal holen, werden die Ergebnisse zwischengespeichert. reload wird sicherstellen, dass Sie neue Ergebnisse erhalten.

Siehe: http://api.rubyonrails.org/classes/ActiveRecord/Associations/CollectionProxy.html

Verwandte Themen