Ho letto l'rspec docs e hanno cercato un certo numero di altri posti, ma io sto avendo un momento difficile cogliere la differenza tra Rspec di let
e let!
Problemi di differenziazione di Rspec "let" vs "let!"
Ho letto che let
non è inizializzato fino a quando è necessario e che la sua il valore è solo memorizzato nella cache per esempio. Ho anche letto che let!
obbliga la variabile all'esistenza immediata e forza l'invocazione per ogni esempio. Credo che da quando sono nuovo, sto avendo un momento difficile vedere come questo si riferisce ai seguenti esempi. Perché è necessario impostare per affermare che m1.content
è presente nella pagina, ma è possibile impostare :user
con let
per affermare che la pagina contiene text: user.name
?
subject { page }
describe "profile page" do
let(:user) { FactoryGirl.create(:user) }
let!(:m1) { FactoryGirl.create(:micropost, user: user, content: "Foo") }
let!(:m2) { FactoryGirl.create(:micropost, user: user, content: "Bar") }
before { visit user_path(user) }
it { should have_selector('h1', text: user.name) }
it { should have_selector('title', text: user.name) }
describe "microposts" do
it { should have_content(m1.content) }
it { should have_content(m2.content) }
it { should have_content(user.microposts.count) }
end
end
describe "after saving the user" do
before { click_button submit }
let(:user) { User.find_by_email('[email protected]') }
it { should have_selector('title', text: user.name) }
it { should have_success_message('Welcome') }
it { should have_link('Sign out') }
end
Questo ha perfettamente senso. Quindi, inviando l'oggetto (m1) un messaggio (contenuto) non è abbastanza usando let perché m1 non è ancora stato inizializzato? – KMcA
Beh, non è questo il motivo per cui il test fallirebbe. Il motivo per cui il test fallisce è perché hai già "visitato la pagina" prima di creare i micropost e quindi la pagina non ha contenuto. Potrei aggiornare la mia risposta per essere un po 'più chiaro su questo se hai ancora dubbi? –
Bene, dopo aver esaminato nuovamente la mia domanda ("dopo aver salvato l'utente") di nuovo, in che modo il secondo test potrebbe verificare 'user.name'? – KMcA