Podążam za samouczkiem ROR Michaela i tworzeniem systemu uwierzytelniania użytkownika. Istnieje przywilej administratora, który pozwala użytkownikom usuwać innych użytkowników. Specjalne linki "usuń" pojawiają się na stronie z listą użytkowników po zalogowaniu jako uprzywilejowany użytkownik administracyjny. Moja aplikacja działa dobrze, ale testy rspec zawodzą z nieznanych mi powodów.Testy Rspec dla administracyjnych połączeń "usuń" nie powiodły się. Tutorial ROR 3.2 Michaela Hartla - Rozdział 9.4.2
Rozdzieliłem testy na inny plik spec/requests/sat_spec.rb
i próbuję użyć gem pry, aby go zdebugować, ale bez powodzenia.
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
Niepowodzenia testów:
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)>'
Co może przez problem tutaj lub ważniejsze jak debugowania?
Można widelec mój kod tutaj https://github.com/tomek-rusilko/miniatury_katalog_2
Jeeez, który był tak oczywiste! Czuję się głupio: D Wielkie dzięki. Umieszczenie prostego 'FactoryGirl.create (: user)' przed rozwiązaniem problemu. Jest jeszcze jedna rzecz, która się pojawiła: dlaczego 'FactoryGirl.create (: user)' działa, ale 'let (: user) {FactoryGirl.create (: user)}' does not? – tomruss
'let' jest oceniany leniwie: jego blok nie zostanie wywołany, dopóki nie użyjesz zmiennej' user' ". Zamiast tego użyj 'let!' (Ze znakiem wykrzyknika), jeśli chcesz, aby Twój blok był natychmiast wywoływany. Ale polecam umieścić 'FactoryGirl.create (: user)' w bloku 'before'. – jdoe
Tak, właśnie to zrobiłem: 'before (: all) {5.times {FactoryGirl.create (: user)}}; after (: all) {User.delete_all} '. Jeszcze raz - dziękuję za pomoc. – tomruss