Gram w Rails od kilku lat i wyprodukowałem kilka łatwych w użyciu aplikacji, które są w produkcji. Zawsze jednak unikałem jakichkolwiek testów i postanowiłem to naprawić. Próbuję napisać kilka testów dla aplikacji, którą napisałem do pracy, która jest już uruchomiona, ale przechodzi ciągłą weryfikację. Obawiam się, że wszelkie zmiany złamie, więc chcę, aby niektóre testy zostały uruchomione. Przeczytałem książkę RSpec, obejrzałem kilka screencastów, ale staram się zacząć (to uderza mnie jako coś, co rozumiesz tylko wtedy, gdy już to zrobiłeś).Jak zasymulować logowanie przy użyciu protokołu RSpec?
Próbuję napisać, co powinno być prostym testem mojego ReportsController. Problem z moją aplikacją polega na tym, że prawie wszystko znajduje się za warstwą uwierzytelniania. Nic nie działa, jeśli nie jesteś zalogowany, więc muszę zasymulować logowanie zanim będę mógł wysłać prostą prośbę o pobranie (chociaż domyślam się, że powinienem napisać kilka testów, aby upewnić się, że nic nie działa bez logowania - dostanę się do to później).
Skonfigurowałem środowisko testowe z RSpec, Capybara, FactoryGirl i Guard (nie byłem pewien, które narzędzia użyć tak użytych sugestii Railscasts). Sposób, w jaki pisałem o moim teście do tej pory, polega na stworzeniu użytkownika w FactoryGirl;
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
a następnie napisz mój test tak;
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
To nie tak jak;
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)>'
Co ciekawe, jeśli mogę zmienić test response.should be_redirect
, test przechodzi co sugeruje mi się, że wszystko działa aż do tej chwili, ale logowanie nie jest rozpoznawane.
Moje pytanie brzmi, co muszę zrobić, aby to logowanie działało. Czy muszę utworzyć użytkownika w bazie danych, która pasuje do danych logowania FactoryGirl? Jeśli tak, jaki jest sens FactoryGirl tutaj (a powinienem nawet z niego korzystać)? Jak mam zrobić tego fałszywego użytkownika w środowisku testowym? Mój system uwierzytelniania jest bardzo prosty, samodzielnie wykonany (oparty na Railscasts episode 250). To zachowanie logowania będzie prawdopodobnie musiało być zreplikowane dla prawie wszystkich moich testów, więc jak mam zrobić to raz w moim kodzie i mając go wszędzie?
Zdaję sobie sprawę, że jest to duże pytanie, więc dziękuję za spojrzenie.
Wielki, dzięki. To ogromny krok w dobrym kierunku. Wprowadziłem to w życie i wciąż mam test na awarię, ponieważ nie mam żadnych użytkowników skonfigurowanych w środowisku testowym. Jak mam je skonfigurować? Użyj FactoryGirl? Utworzyć je w konsoli za pomocą środowiska testowego? Skopiować istniejącą produkcyjną bazę danych do środowiska testowego? – brad
Właściwie, nie martw się. Udało mi się to zrobić za pomocą FactoryGirl; 'opisz" GET 'index' "do; "powinien odnieść sukces"; użytkownik = FactoryGirl.create (: użytkownik); logowanie (użytkownik); get: index; response.should be_success; koniec; koniec; '. Musiałem zmienić 'request.session [: user]' na 'request.session [: user_id]' ale poza tym wszystko w twoim kodzie działało dla mnie i teraz mam swój pierwszy test przejścia! Dziękuję Ci. – brad
Tak, twoje rozwiązanie z FactoryGirl do stworzenia użytkownika jest w zasadzie tym, co robimy. Pamiętaj, aby zaakceptować odpowiedź, jeśli działa ona dla Ciebie. Dzięki! – Brandan