2012-05-26 10 views
6

Sto seguendo il tutorial di Michael ROR e creando un sistema di autenticazione utente. C'è un privilegio di amministratore, che consente agli utenti di eliminare altri utenti. I link speciali "Elimina" vengono visualizzati nella pagina di elenco degli utenti quando si accede come utente amministratore privato. La mia app funziona bene ma i test di rspec non riescono per un motivo a me sconosciuto.I test Rspec per i collegamenti di "eliminazione" amministrativi falliscono. Tutorial ROR 3.2 di Michael Hartl - Capitolo 9.4.2

Ho separato i test in un altro file spec/requests/sat_spec.rb e sto tentando di utilizzare pry gem per eseguire il debug, ma finora nessun successo.

describe "delete links" do 
    describe "as admin user" do 
    let(:admin) { FactoryGirl.create(:admin) } 
    before do 
     sign_in admin 
     visit users_path 
     binding.pry   
    end 
    it { should have_link('delete', href: user_path(User.first)) } 

    it "should be able to delete another user" do 
    expect { click_link('delete') }.to change(User, :count).by(-1) 
    end  
end 

fallimenti dei test:

1) separated admin tests delete links as admin user 
Failure/Error: it { should have_link('delete', href: user_path(User.first)) } 
    expected link "delete" to return something 
# ./spec/requests/sat_spec.rb:25:in `block (4 levels) in <top (required)>' 

2) separated admin tests delete links as admin user should be able to delete another user 
Failure/Error: expect { click_link('delete') }.to change(User, :count).by(-1) 
Capybara::ElementNotFound: 
    no link with title, id or text 'delete' found 
# (eval):2:in `click_link' 
# ./spec/requests/sat_spec.rb:28:in `block (5 levels) in <top (required)>' 
# ./spec/requests/sat_spec.rb:28:in `block (4 levels) in <top (required)>' 

Che cosa potrebbe dal problema qui o ancora più importante come eseguire il debug esso?

È possibile sborsare il mio codice qui https://github.com/tomek-rusilko/miniatury_katalog_2

risposta

9

Si aspetta che la pagina /users contenga l'elenco di utenti con il link "Elimina" accanto a essi. Ma non hai riempito il tuo db TEST con utenti semplici. Contiene solo un utente, l'amministratore. Ma secondo il tuo users/_user.html.erb questo tipo di utenti non ha il link 'cancella'. Quindi, aggiungi almeno una dichiarazione di creazione utente e riprova.

+0

Jeeez che era così ovvio! Mi sento stupido: D Grazie mille. Mettendo semplice 'FactoryGirl.create (: user)' prima di risolvere il problema. C'è un'altra cosa che è comparsa: perché FactoryGirl.create (: user) 'funziona ma' let (: user) {FactoryGirl.create (: user)} 'no? – tomruss

+1

'let' viene valutato pigramente: il suo blocco non verrà chiamato finché non si utilizza la variabile' utente' ". Usa 'let!' (Con il punto esclamativo) invece se vuoi che il tuo blocco venga chiamato immediatamente. Ma ti consiglio di mettere il tuo 'FactoryGirl.create (: user)' nel blocco 'before'. – jdoe

+0

Sì, è esattamente quello che ho fatto: 'before (: all) {5.times {FactoryGirl.create (: user)}}; dopo (: tutti) {User.delete_all} '. Ancora una volta - Grazie per l'aiuto. – tomruss

0
let(:admin) { FactoryGirl.create(:admin) } 

che va bene, dal momento che hai (in spec/factories.rb)

factory :admin do 
    admin true 
end 

Ma intanto, nei modelli/utente .rb:

attr_accessible :name, :email, :password, :password_confirmation 

La mia scommessa è che la factory girl sta usando l'assegnazione di massa per impostare: admin => true, che viene quindi eliminato da attr_accessible.

Ma ancora più importante, come si esegue il debug? Chiedendo "cosa sta succedendo?" e "cosa mi aspetto che accada?" e variazioni su di esso fino a quando non trovi che le risposte ad entrambe le domande si incontrano nel mezzo. In questo caso, le domande che vorrei iniziare sono: che cosa provoca la visualizzazione del link? È vero per il modello che ho creato nelle specifiche? La specifica sta colpendo le pagine che mi aspetto che faccia? Il modello agisce allo stesso modo quando premo la pagina con il browser così come è nelle specifiche?

Ma tutte queste sono solo variazioni di "cosa sta succedendo?" e "Cosa mi aspetto che accada?"

+0

Non so esattamente come, ma FactoryGirls si occupa di esso e l'attributo admin è impostato correttamente. Questa è un'altra domanda interessante. Ad ogni modo questo non era il caso (vedi sopra) ma grazie per l'aiuto e per il buon consiglio - Sto scrivendo queste domande di debug e inchiodandolo sul mio muro :) – tomruss

+0

Ok, è di design che le fabbriche ignorano attr_accessible – tomruss

Problemi correlati