2012-04-17 2 views
6

ho scritto questo spec in products_controller_spec.rb, che ha lo scopo di testare un reindirizzamento quando distruggere viene chiamato su un record inesistente:RecordNotFound sollevato quando si utilizza find_by_id per ottenere il record inesistente in RSpec

it "deleting a non-existent product should redirect to the user's profile page with a flash error" do   
    delete :destroy, {:id => 9999} 
    response.should redirect_to "/profile" 
    flash[:error].should == I18n.t(:slideshow_was_not_deleted) 
end 

Ecco l'azione di controllo in products_controller.rb:

Ora, non mi aspettavo le specifiche di passare prima volta, ma non capisco il motivo per cui è in mancanza con questo:

Failure/Error: delete :destroy, {:id => 9999} 
ActiveRecord::RecordNotFound: 
    Couldn't find Product with id=9999 

Avevo l'impressione che #find_by_id non restituisse l'errore RecordNotFound su un record inesistente. Allora perché ne sto prendendo uno? Grazie in anticipo!

+1

Quale versione di Rails usi? Questo 'find_by_id' funziona bene qui con Rails 3.2.3. (restituendo nil invece di aumentare RecordNotFound) – Deradon

+0

3.2.2 qui. Dovrei aggiungere che find_by_id funziona nel browser. Sto ottenendo RecordNotFound solo nei risultati delle specifiche. – theflyingbrush

+0

- In realtà, appena provato nel browser con un'azione di visualizzazione su un record inesistente e ottenuto un recordNotFound. Sono andato via quando ho commentato l'autenticazione CanCan nel controller. Sembra che CanCan stia lanciando il RnF – theflyingbrush

risposta

16

L'errore RecordNotFound veniva generato da CanCan. Non è in grado di eseguire il ripristino dall'azione del controller (presumibilmente si verifica prima dell'esecuzione dell'azione). C'erano due modi per risolverlo -

  1. Cambiare le specifiche per:

    it "deleting a non-existent product should result in a RecordNotFound Error" do   
        product_id = 9999 
        expect { delete :destroy, {:id => product_id}}.to raise_error ActiveRecord::RecordNotFound 
    end 
    

o, 2. Patching CanCan like this.

Non mi piaceva il percorso di patching, quindi sono andato per l'opzione 1.