2013-10-29 9 views
21

Ho il seguente codice all'interno la maggior parte dei miei test:In RSpec, utilizzando lasciare variabile all'interno di prima: tutti i blocchi

describe 'index' 
let(:company) { FactoryGirl.create(:company) } 
let(:user) { FactoryGirl.create(:user, company: company) } 

before do 
    sign_in user 
    visit products_path 
end 
... 
end 

Ma sto ottenendo il seguente avviso:

WARNING: let declaration 'user' accessed in a 'before(:all)' 

La mia domanda è, qual è il modo corretto di farlo? Non riesco a trovare molte informazioni sull'avviso stesso.

Grazie!

EDIT: Il mio obiettivo è quello di utilizzare la variabile utente in modo che posso trasmetterla ai sign_in, che firma l'utente, e utilizzare in un secondo momento un altro test (a verificare per l'attributo della società dell'utente)

+2

Sembra che questo sia il modo giusto. Sei sicuro che non ci sia un 'before (: all)' che non stiamo vedendo? – zetetic

+0

Sì, ho pensato che ci fosse _ prima (: tutto) che non stavi mostrando. Non è questo il caso? –

+0

L''indice' è, credo, non il tuo blocco descrittivo di primo livello, è annidato in un'altra descrizione o blocco di contesto sopra di esso? In altre parole, sei sicuro di non ereditare qualcosa. Inoltre, 'before do' è uguale a' before: each do'. È implicito. Puoi mostrare l'intero file delle specifiche? – fontno

risposta

20

Ho avuto lo stesso problema, ho risolto dichiarando tutte le mie variabili come attributi all'interno del blocco before:

 
describe 'index' 

before(:all) do 
    @company = FactoryGirl.create(:company) 
    @user = FactoryGirl.create(:user, company: @company) 

    sign_in @user 
    visit products_path 
end 
... 
end 

Ora è possibile utilizzare @user e @company dentro i test, e non si dovrebbe avere eventuali avvisi.

+1

Finito facendo esattamente questo. Per qualche ragione non mi piace lo stile, ma risolve il problema per il momento. Grazie! –

1

Non sono sicuro di cosa intendi con "questo" in "qual è il modo corretto di farlo"? Accesso let e subject entro un before(:all) è obsoleto e sarà rimosso in RSpec 3 con la seguente spiegazione da https://github.com/rspec/rspec-core/pull/857:

let e subject dichiarazioni non sono destinati ad essere messa in un gancio before(:all), come esistono definire stato che viene ripristinato tra ciascun esempio, mentre before(:all) esiste per definire lo stato che è condiviso tra gli esempi in un gruppo di esempio.

+0

Non vedo il loro codice usando prima (: tutto), però, poco prima. – Trejkaz

+0

@trejkaz, per i commenti sulla domanda, ero uno di un gruppo di persone che si chiedevano se ci fosse un 'let' in un blocco contenente' describe' che non era mostrato. Il poster diceva che avrebbe caricato l'intero file spec, ma posso vedere che non l'hanno mai fatto. –

0

Tenendo risposta conto di Pietro Penso che il modo corretto è quello di accedere l'utente in una prima di ogni blocco:

before(:each) do 
    sign_in user 
end 
+2

Ricevo ancora l'avviso Obsoleto ... –

Problemi correlati