2012-04-15 10 views
2

Ich habe es in Kapitel 9 des Ruby on Rails Tutorials gemacht und eigene Funktionen hinzugefügt, um einen Benutzer bei der ersten Anmeldung zu sperren, so wie es ein Admin hat um ihre ID einzugeben und zu genehmigen ("entsperren"), bevor ein neuer Benutzer auf die Site zugreifen kann. Ich habe ein: locked boolean-Attribut hinzugefügt, das genau wie das admin-Attribut des User-Objekts funktioniert. Ich arbeite jetzt alles, aber ich habe Schwierigkeiten, einen einfachen Test dafür zu schreiben. Ich habe den folgenden Test user_pages_spec.rb, knapp unter der Hierarchie „Paginierung“ - „als Admin-Benutzer“:Test für neue Benutzersperrfunktion Ich schrieb für Rails Tutorial App

describe "as an admin user to unlock new users" do 
    let(:admin) { FactoryGirl.create(:admin) } 
    let(:locked_user) { FactoryGirl.create(:locked) } 
    before do 
     sign_in admin 
     visit users_path 
    end 

    it { should have_link('unlock', href: user_path(locked_user)) } 
    it { should_not have_link('unlock', href: user_path(admin)) } 
end 

und die Schaffung eines „gesperrt“ Benutzer zu unterstützen, hat dieses Bild factories.rb :

factory :locked do 
    locked true 
end 

ich, dass die Entriegelung Link zeigt sich manuell durch Firefox bestätigen kann, aber ich bin immer noch die folgende Versagen bekommen:

1) User pages index pagination as an admin user to unlock new users 
    Failure/Error: it { should have_link('unlock', href: user_path(locked_user)) } 
     expected link "unlock" to return something 
    # ./spec/requests/user_pages_spec.rb:64:in `block (5 levels) in <top (required)>' 

ich interessiert bin), warum dies nicht zu wissen:), b ut auch b) wie man ein Problem wie dieses debuggt. Wie kann ich sagen, was der Test tatsächlich "sieht"? Ich habe rails-pry mit einem anderen Problem versucht, wie es von einem anderen stackoverflow-Benutzer vorgeschlagen wurde, aber in diesem Fall habe ich festgestellt, dass es nur von begrenztem Nutzen ist.

Alle Ideen oder Vorschläge würden sehr geschätzt werden. Danke im Voraus!

-Matt

Antwort

0

Sie sollen den Test zuerst schreiben;)

Arbeiten mit dem Test als Start, ich habe durch den Prozess gearbeitet. Ich bin zu dem Punkt gekommen, den gleichen Fehler zu bekommen wie du. Mit Hilfe der hebeln-Schienen gem und setzen binding.pry im Test:

it { binding.pry ; should have_link('unlock', href: user_path(locked_user)) } 

(Nach viel herum in Unordnung) Ich kopieren und aus dem Test an der Eingabeaufforderung:

should have_link('unlock', href: user_path(locked_user)) 

und erhalten der Fehler. Ändern zu:

should have_link('unlock', href: user_path(User.first)) 

funktioniert. Die Eingabe von locked_user an der Eingabeaufforderung zeigt mir den Benutzerdatensatz an. Als nächstes habe ich page.body eingegeben und es zeigt mir, dass mein gesperrter Benutzer nicht einmal auf der Seite erscheint. (Bestätigt durch die Eingabe von User.count und festgestellt, dass es 33 ist, so war es auf Seite 2.) Sie haben dieses Problem möglicherweise nicht abhängig davon, wie tief der Test eingebettet ist die Spezifikationen. Ich erkannte, dass ich es versehentlich in eine andere Spezifikation eingebettet hatte. Als ich es verschoben habe (User.count == 2), hat es immer noch nicht funktioniert. Mein locked_user war immer noch nicht auf der Seite. User.all hat den Benutzer auch nicht eingeschlossen. Hartl erwähnt in Kapitel 10,

Dies verwendet die Let! (lesen Sie "let bang") Methode anstelle von Let; Der Grund ist, dass Variablen faul sind, was bedeutet, dass sie erst dann entstehen, wenn sie referenziert werden.

Geändert die lassen zu lassen! und es hat funktioniert. (Benutzer.count == 3, einschließlich der locked_user diesmal.) Hier ist der Testblock.

Mein Code entschlüsselt noch nichts (ich brauche noch einen Test dafür ...), aber der Link erscheint, wenn es sollte. :)

+0

Hallo Eric, nochmals vielen Dank für die Hilfe! Ich habe Ihren modifizierten Test oben in verschiedenen Teilen der Datei user_pages_spec.rb ausprobiert, und kein Glück. Auch nachdem ich den binding.pry Breakpoint gesetzt und dann page.body inspiziert habe, kann ich sehen, dass der Link "unlock" auf der Seite ist und locked_user korrekt ist. Ich frage mich, ob ich einen Link auf eine Weise erstelle, die das Testframework versteht. Hier ist der relevante Teil von _user.html.erb: '<% if current_user.admin? && user.locked? &&! current_user? (Benutzer)%> | <% = link_to "unlock", unlock_user_path (user), Methode:: get, confirm: "Neuen Benutzer aktivieren?" %> <% end %> ' – newton10471

+0

versuchen Sie unlock_user_path (Benutzer) am Haltepunkt, um sicherzustellen, dass es das ist, was Sie erwarten. – EricM

+0

Hier ist das Ergebnis: '[1] pry (# )> unlock_user_path (user) =>"/users/826/entsperren " [2] pry (# )>'. Ich habe auch die 'save_and_open_page' Methode von Capybara entdeckt und ausprobiert, die einen Webbrowser mit der fraglichen Seite an der fraglichen Stelle öffnet, und es zeigte die Seite, die ich erwartet hatte. Ich überlege, diesen Test aus der Datei user_pages_spec.rb zu entfernen und ihn in eine eigene Testdatei einzufügen, um ihn von allem anderen zu isolieren, das sich störend auswirken könnte. – newton10471

0
it { should have_link('unlock', href: user_path(locked_user)) } 

Auf den ersten Blick müssen Sie so etwas wie response.body.should have... oder page.should.have... verwenden.

Möglicherweise ist auch render_views erforderlich.

0

Sie wollen wahrscheinlich:

let!(:locked_user) { FactoryGirl.create(:locked) } 

Beachten Sie, dass ich let!() bin mit zu let() gegenüber. Siehe rspec docs für weitere Informationen über let() vs let!() und warum es hier zählt.