Ich spiele jetzt seit ein paar Jahren mit Rails und habe ein paar bearbeitbare Apps produziert, die in Produktion sind. Ich habe es immer vermieden, Tests durchzuführen, und ich habe beschlossen, das zu korrigieren. Ich versuche, einige Tests für eine App zu schreiben, die ich für eine Arbeit geschrieben habe, die bereits läuft, aber ständig überarbeitet wird. Ich bin besorgt, dass irgendwelche Änderungen die Dinge brechen werden, also möchte ich einige Tests starten und laufen. Ich habe das RSpec-Buch gelesen, ein paar Screencasts gesehen, aber ich habe Mühe, loszulegen (es fällt mir so auf, wie du es nur verstehst, wenn du es erst einmal getan hast).Wie simuliere ich eine Anmeldung mit RSpec?
Ich versuche zu schreiben, was ein einfacher Test meines ReportsController sein sollte. Das Problem mit meiner App ist, dass das ganze Ding hinter einer Authentifizierungsschicht sitzt. Nichts funktioniert, wenn Sie nicht eingeloggt sind, also muss ich eine Anmeldung simulieren, bevor ich eine einfache Anfrage senden kann (obwohl ich denke, dass ich einige Tests schreiben sollte, um sicherzustellen, dass nichts ohne Login funktioniert - ich komme dazu das später).
Ich habe eine Testumgebung mit RSpec, Capybara, FactoryGirl und Guard eingerichtet (war nicht sicher, welche Tools zu verwenden sind, so dass die Vorschläge von Railscasts verwendet wurden). Die Art, wie ich meinen Test bisher geschrieben habe, besteht darin, einen Benutzer in FactoryGirl zu erstellen;
FactoryGirl.define do
sequence(:email) {|n| "user#{n}@example.com"}
sequence(:login) {|n| "user#{n}"}
factory :user do
email {FactoryGirl.generate :email}
login {FactoryGirl.generate :login}
password "abc"
admin false
first_name "Bob"
last_name "Bobson"
end
end
und dann schreibe meinen Test so;
require 'spec_helper'
describe ReportsController do
describe "GET 'index'" do
it "should be successful" do
user = Factory(:user)
visit login_path
fill_in "login", :with => user.login
fill_in "password", :with => user.password
click_button "Log in"
get 'index'
response.should be_success
end
end
end
Dies funktioniert nicht so;
1) ReportsController GET 'index' should be successful
Failure/Error: response.should be_success
expected success? to return true, got false
# ./spec/controllers/reports_controller_spec.rb:13:in `block (3 levels) in <top (required)>'
Interessanter wenn ich response.should be_redirect
meinen Test ändern, hat der Test bestanden, die ich zeigt, dass alles, was bis zu diesem Punkt Aufarbeiten wird, aber die Login nicht erkannt wird.
Also meine Frage ist, was ich tun muss, um dieses Login funktionieren zu lassen. Muss ich einen Benutzer in der Datenbank erstellen, der den FactoryGirl-Anmeldeinformationen entspricht? Wenn ja, worauf kommt FactoryGirl hier hinaus (und sollte ich es sogar verwenden)? Wie gehe ich vor, um diesen gefälschten Benutzer in der Testumgebung zu erstellen? Mein Authentifizierungssystem ist ein sehr einfaches selbstgemachtes System (basierend auf Railscasts episode 250). Dieses Anmeldeverhalten wird vermutlich für fast alle meine Tests repliziert werden müssen. Wie gehe ich also vor, es einmal in meinem Code zu tun und überall anzuwenden?
Ich weiß, das ist eine große Frage, also danke ich Ihnen für einen Blick.
Große, dank des Wächters zu verwenden. Das ist ein großer Schritt in die richtige Richtung. Ich habe dies in die Praxis umgesetzt und habe immer noch einen fehlgeschlagenen Test, da ich in der Testumgebung keine Benutzer eingerichtet habe. Wie sollte ich sie einrichten? Verwenden Sie FactoryGirl? Erstellen Sie sie in der Konsole mit einer Testumgebung? Über eine vorhandene Produktionsdatenbank in die Testumgebung kopieren? – brad
Eigentlich keine Sorge. Ich habe es mit FactoryGirl so gemacht; 'beschreiben" GET 'index' "do; es "sollte erfolgreich sein" tun; Benutzer = FactoryGirl.create (: Benutzer); Login (Benutzer); erhalten: Index; response.should be_success; Ende; Ende; '. Ich musste 'request.session [: user]' in 'request.session [: user_id]' ändern, aber abgesehen davon funktionierte alles in Ihrem Code für mich und ich habe jetzt meinen ersten bestandenen Test! Vielen Dank. – brad
Ja, Ihre Lösung mit FactoryGirl zur Erstellung des Benutzers ist im Wesentlichen das, was wir auch tun. Bitte achten Sie darauf, die Antwort zu akzeptieren, wenn es für Sie funktioniert. Vielen Dank! – Brandan