2012-05-26 17 views
6

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

Odpowiedz

9

Oczekujesz, że Twoja strona /users będzie zawierała listę użytkowników z linkiem "usuń" obok nich. Ale nie wypełniłeś bazy danych TESTa prostymi użytkownikami. Zawiera tylko jednego użytkownika, administratora. Ale według twojego users/_user.html.erb tego typu użytkownicy nie mają linku "usuń". Dodaj co najmniej jedną instrukcję utworzenia użytkownika i spróbuj ponownie.

+0

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

+1

'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

+0

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

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

Który jest w porządku, ponieważ masz (w specyfikacji/factories.rb)

factory :admin do 
    admin true 
end 

Ale tymczasem, w modelach/user .rb:

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

Założę się, że dziewczyna z fabryki używa przyporządkowania ment do ustawienia: admin => true, które jest następnie odrzucane przez attr_accessible.

Co ważniejsze, jak to debugować? Pytając "co się dzieje?" i "czego mam się spodziewać?" i wariacje na ten temat, dopóki nie znajdziesz odpowiedzi na oba pytania w środku. W takim przypadku pytania, od których zaczynam, są następujące: co powoduje wyświetlenie linku? Czy to prawda w przypadku modelu, który ustawiłem w specyfikacji? Czy specyfik trafia w strony, na które czekam? Czy model działa w ten sam sposób, gdy trafiam na stronę z przeglądarką, tak jak jest w specyfikacji?

Ale wszystkie te są tylko wariacjami "co się dzieje?" i "Czego mam się spodziewać?"

+0

Nie wiem dokładnie, jak to się dzieje z FactoryGirls, a atrybut administratora jest ustawiony prawidłowo. To kolejne interesujące pytanie. W każdym razie tak nie było (patrz wyżej), ale dziękuję za pomoc i za dobrą radę - zapisuję te pytania i przypinam je do mojej ściany :) – tomruss

+0

Ok, z założenia fabryki ominą attr_accessible – tomruss

Powiązane problemy