Ich versuche Übung 2 von Kapitel 8.5 in Michael Hartls Ruby on Rails Tutorial . Die Übung ist wie folgt:
Folgen Sie dem Beispiel in Abschnitt 8.3.3, gehen Sie durch die Benutzer- und Authentifizierungsanforderungsspezifikationen (dh die Dateien, die sich derzeit im Verzeichnis spec / requests befinden) und definieren Sie Funktionen in spec / support / utilities.rb, um die Tests zu entkoppeln die Umsetzung. Zusätzliches Guthaben: Organisieren Sie den Support-Code in separaten Dateien und Modulen und sorgen Sie dafür, dass alles funktioniert, indem Sie die Module ordnungsgemäß in die Spec-Helper-Datei aufnehmen.
Beispiel 8.3.3: utilities.rb
%Vor% Die definierte Funktion valid_signin(user)
wird im folgenden Block von authentication_pages_spec.rb
verwendet und funktioniert einwandfrei.
In diesem Beispiel habe ich mich daran gemacht, mein eigenes namens valid_signup(user)
:
Ich verwende diesen Block in user_pages_spec.rb
wie folgt:
Es funktioniert nicht. Spork / Guard meldet diese Fehler:
%Vor% Die Fehler scheinen darauf hinzuweisen, dass der user.name in meiner valid_signup(user)
-Funktion in utilities.rb
nicht definiert ist, aber ich sehe keinen Grund dafür. Ich habe Guard mehrmals neu gestartet und eine rake db:test:prepare
ausgeführt, um sicherzustellen, dass die Testdatenbank (mit postgresql) in Ordnung ist.
Hier ist meine factories.rb
für die Vollständigkeit:
Bevor ich weiter versuche, mehr von der Testsuite zu entkoppeln, möchte ich diesen Fehler sehr gerne lösen und, noch wichtiger, den Grund dafür verstehen.
BEARBEITEN
Ich habe Ihre Tipps ausprobiert und die Funktion in user_pages_spec.rb
wie folgt bearbeitet:
Da ich let(:user){FactoryGirl.create(:user)}
von der Funktion entfernt habe, vermutete ich, dass in der Funktion kein Benutzer mehr erstellt wurde. Daher musste valid_signup(user)
definiert werden, da die Variable user
für valid_signup
nicht mehr gefüllt wurde Fabrikmädchen:
Das hat nicht funktioniert und gab mir folgende Fehler:
%Vor% Ich habe auch versucht, den Test mit valid_signup(user)
so auszuführen, wie ich ihn vorher hatte (mit user.name, user.email, user.password, user.password_confirmation
, was auch nicht funktioniert hat, mit Fehlern:
Als nächstes habe ich versucht, es auszuführen, ohne Variablen in user_pages_spec.rb
: before { valid_signup() }
und ohne eine Variable in der Funktion in utilities.rb
:
Dies hat zurückgegeben:
%Vor%Immer noch nicht näher an der Antwort. Ich könnte etwas Einfaches übersehen. Keine Ahnung was aber. Ich habe aber das erste Mal falsch gemacht: Ich dachte nur, dass FactoryGirl eine Möglichkeit wäre, Variablen zu erstellen, und ich wusste nicht, dass es tatsächlich etwas mit meiner Testdatenbank getan hat.
FactoryGirl speichert den Benutzer in der Datenbank, dann besuchen Sie den sign_in_path mit dem Benutzer bereits in der Datenbank und füllen das Formular für sign_in mit valid_sigin (user)
%Vor%Wenn Sie das tun:
%Vor%Factory Girl speichert den Benutzer in der Datenbank, und Sie füllen ein Formular mit einer bereits vergebenen E-Mail.
BEARBEITEN:
%Vor% Sie haben keine Variable benutzerdefiniert, da Sie let(:user){FactoryGilr.create(:user)}
gelöscht haben, und Sie sollten den richtigen Pfad aufrufen, Ihr aktueller Pfad ist "sign_in_path" und sollte "sign_up_path"
Sie sollten so etwas tun:
utilities.rb
%Vor%user_pages_spec.rb
%Vor%Ich hatte das gleiche Problem und habe die Lösung herausgefunden: Wenn Sie valid_signup definieren, sollte es 'page' als Argument nehmen. Immerhin testen Sie die Seitenelemente, nicht den Benutzer.
spec / support / utilities.rb
%Vor%spec / requests / user_pages_spec.rb
beschreiben "mit gültiger Information" tun vor {valid_signup (Seite)}
%Vor%Ich hoffe, das hilft!
UPDATE Mir ist jetzt klar, dass das wegen des Umfangs der Variablen 'page' funktioniert (da es das Thema ist). Um "user" zu verwenden, habe ich die Zeile
hinzugefügt %Vor%oben
vor { sign_up(user) }
. Das hat dann eine spätere Spezifikation gekappt, wo ich auch versucht habe, 'user' als Variable zu verwenden, also habe ich den Namen in 'editeduser' geändert. Hier ist das vollständige Beispiel:
user_pages_spec.rb
%Vor%...
%Vor%Hoffentlich hilft das jemandem!
Ich war auch neugierig auf diese Frage und habe eine Antwort gefunden, die eher mit dem übereinstimmt, was Hartl erwartete (obwohl ich beim Lernen nicht 100% sicher bin, dass die beste Antwort nicht eleganter ist oder nicht) ).
Da wir FactoryGirl nicht zur Anmeldung von Benutzern, sondern zur Anmeldung verwendet haben, wollte ich es nicht in meinem Refactoring verwenden. Das habe ich in meinen utilities.rb:
%Vor%und dann in user_pages_spec.rb habe ich
ersetzt %Vor%mit
%Vor%Wir brauchen keinen Benutzer, der in der Datenbank gespeichert werden soll, nur um eine einmalige Anmeldung zu überprüfen, da sie nicht mehrere Seitenaufrufe durchlaufen müssen. Da wir keinen Benutzer suchen, brauchen wir auch kein (Benutzer-) Argument nach der Methode valid_signup (ich denke, dass die Terminologie korrekt ist. Bitte korrigiere mich, wenn ich das nicht tue.)
Tags und Links ruby-on-rails rspec railstutorial.org