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