Ho giocato con Rails per un paio d'anni e ho prodotto un paio di app passabili che sono in produzione. Ho sempre evitato di fare test e ho deciso di correggerlo. Sto provando a scrivere alcuni test per un'app che ho scritto per il lavoro che è già attivo e funzionante ma in costante revisione. Sono preoccupato del fatto che eventuali modifiche interromperanno le cose, quindi voglio avere alcuni test attivi e funzionanti. Ho letto il libro di RSpec, ho guardato alcuni screencast ma sto faticando per iniziare (mi sembra il tipo di cosa che capisci solo dopo averlo fatto).Come si simula un accesso con RSpec?
Sto provando a scrivere quello che dovrebbe essere un semplice test del mio ReportsController. Il problema con la mia app è che praticamente l'intera cosa si trova dietro un livello di autenticazione. Nulla funziona se non hai effettuato l'accesso, quindi devo simulare un login prima di poter inviare anche una semplice richiesta get (anche se penso che dovrei scrivere alcuni test per assicurarmi che nulla funzioni senza un login - Arriverò a più tardi).
Ho installato un ambiente di test con RSpec, Capybara, FactoryGirl e Guard (non ero sicuro di quali strumenti utilizzare i suggerimenti di Railscast così utilizzati). Il modo in cui sono andato a scrivere il mio test finora è creare un utente in FactoryGirl in questo modo;
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
e quindi scrivere il mio test in questo modo;
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
Questo non funziona così;
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)>'
È interessante notare che se cambio il mio test per response.should be_redirect
, il test viene superato, che mi fa pensare che tutto funzioni fino a quel punto, ma il login non viene riconosciuta.
Quindi la mia domanda è cosa devo fare per far funzionare questo accesso. Devo creare un utente nel database che corrisponda alle credenziali di FactoryGirl? Se è così, qual è il punto di FactoryGirl qui (e dovrei anche usarlo)? Come faccio a creare questo falso utente nell'ambiente di test? Il mio sistema di autenticazione è un self-made molto semplice (basato su Railscasts episode 250). Presumibilmente questo comportamento di registrazione dovrebbe essere replicato per quasi tutti i miei test, quindi come faccio a farlo una volta nel mio codice e applicandolo ovunque?
Mi rendo conto che questa è una grande domanda, quindi ti ringrazio per aver dato un'occhiata.
Grande, grazie. Questa è una spinta enorme nella giusta direzione. L'ho messo in pratica e ho ancora un test fallito perché non ho impostato nessun utente nell'ambiente di test. Come dovrei andare a configurarli? Usa FactoryGirl? Creali nella console con un ambiente di test? Copia su un database di produzione esistente nell'ambiente di test? – brad
In realtà, non preoccuparti. Sono riuscito a farlo con FactoryGirl in questo modo; 'descrive" GET 'index' "do; "dovrebbe avere successo" fare; user = FactoryGirl.create (: user); login (utente); ottieni: indice; response.should be_success; fine; fine; '. Ho dovuto cambiare 'request.session [: user]' a 'request.session [: user_id]' ma, a parte questo, tutto nel tuo codice ha funzionato per me e ora ho il mio primo test di passaggio! Grazie. – brad
Sì, la soluzione che utilizza FactoryGirl per creare l'utente è essenzialmente ciò che facciamo anche noi. Assicurati di accettare la risposta se funziona per te. Grazie! – Brandan