2012-05-26 8 views
6

Ich folge Michaels ROR-Tutorial und erstelle ein Benutzerauthentifizierungssystem. Es gibt ein Admin-Privileg, mit dem Benutzer andere Benutzer löschen können. Spezielle "Löschen" -Links erscheinen auf der Nutzerliste, wenn sie als privilegierter Administrator angemeldet sind. Meine App funktioniert gut, aber rspec Tests scheitern aus einem mir unbekannten Grund.Rspec-Tests für administrative "Lösch" -Links schlagen fehl. Michael Hartls ROR 3.2 Tutorial - Kapitel 9.4.2

Ich habe die Tests in eine andere Datei spec/requests/sat_spec.rb getrennt und ich versuche, Pry Juwel zu verwenden, um es zu debuggen, aber bisher keinen Erfolg.

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 

Testfehler:

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)>' 

Was durch das Problem hier könnte oder was noch wichtiger ist, wie es zu debuggen?

Sie können meinen Code Gabel hier https://github.com/tomek-rusilko/miniatury_katalog_2

Antwort

9

Sie erwarten, dass Ihre /users Seite die Liste der Benutzer enthält, bei denen der Link zum Löschen angezeigt wird. Aber Sie haben Ihre TEST db nicht mit einfachen Benutzern gefüllt. Es enthält nur einen Benutzer, den Administrator. Aber nach Ihrer users/_user.html.erb diese Art von Benutzern hat nicht "löschen" -Link. Fügen Sie also mindestens eine Benutzererstellungsanweisung hinzu und versuchen Sie es erneut.

+0

Jeeez das war so offensichtlich! Ich fühle mich dumm: D Vielen Dank. Einfaches 'FactoryGirl.create (: user)' zu setzen löste vorher das Problem. Es gibt eine andere Sache, die auftauchte: Warum 'FactoryGirl.create (: user)' funktioniert, aber 'let (: user) {FactoryGirl.create (: user)}} nicht? – tomruss

+1

'let' wird lazily ausgewertet: sein Block wird nicht aufgerufen, bis Sie' user' "variable" verwenden. Verwenden Sie stattdessen 'let!' (Mit dem Ausrufezeichen), wenn Sie möchten, dass Ihr Block sofort aufgerufen wird. Aber ich würde Ihnen empfehlen, Ihr 'FactoryGirl.create (: user)' in 'before' zu ​​setzen. – jdoe

+0

Ja, genau das habe ich gemacht: 'before (: all) {5.x {FactoryGirl.create (: user)}}; nach (: alle) {User.delete_all} '. Nochmals - Danke für Ihre Hilfe. – tomruss

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

was in Ordnung ist, da man (in spec/factories.rb)

factory :admin do 
    admin true 
end 

Aber inzwischen haben, in Modellen/user .rb:

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

Meine Wette ist, dass Fabrik Mädchen Masse-assign verwendet Einstellung: admin => true, die dann von attr_accessible gelöscht wird.

Aber noch wichtiger, wie debuggen Sie es? Durch die Frage "was passiert?" und "was erwarte ich zu passieren?" und Variationen darauf, bis Sie feststellen, dass die Antworten auf beide Fragen in der Mitte treffen. In diesem Fall lauten die Fragen, mit denen ich beginnen würde: Was bewirkt die Anzeige der Verknüpfung? Gilt das für das Modell, das ich in der Spezifikation eingerichtet habe? Kommt die Spezifikation auf die Seiten, von denen ich es erwarte? Funktioniert das Modell genauso, wenn ich mit dem Browser auf die Seite klicke, wie es in der Spezifikation ist?

Aber all das sind nur Variationen von "was passiert?" und "Was erwarte ich zu passieren?"

+0

Ich weiß nicht genau wie aber FactoryGirls damit umgehen und Admin-Attribut richtig eingestellt ist. Das ist eine andere interessante Frage. Wie auch immer, das war nicht der Fall (siehe oben), aber danke für die Hilfe und für den fundierten Rat - ich schreibe diese Debugging-Fragen auf und befestige sie an meiner Wand :) – tomruss

+0

Ok, es ist per Entwurf, dass Fabriken umgehen attr_accessible – tomruss

Verwandte Themen