2012-08-25 14 views
15

Utilizzo di rotaie, escogitare, rspec & factorygirl:Dove posso confermare l'utente creato con FactoryGirl?

Provare a creare dei test per il mio sito. Sto usando il modello confermabile per ideare così quando creo un utente usando FactoryGirl, l'utente non è confermato.

Questo è il mio factories.rb:

FactoryGirl.define do 
    factory :user do 
    full_name    "Aren Admin" 
    email     "[email protected]" 
    password    "arenaren" 
    password_confirmation "arenaren" 
    role_id    ADMIN 
    end 
end 

E questo è il mio rspec file di test:

require 'spec_helper' 

describe "Admin pages" do 

    subject { page } 

    describe "home page" do 
    let(:user) { FactoryGirl.create(:user) } 
    before { visit admin_home_path } 

    it { should have_content("#{ROLE_TYPES[user.role_id]}") } 
    end 
end 

Ricevo un errore perché l'utente non è confermata. Cercando in giro sono abbastanza sicuro di aver bisogno di usare il metodo 'conferma!' e che appartiene al file factories.rb, ma non sono sicuro di dove metterlo.

risposta

9

Prova user.confirm! nel vostro before blocco

trovato here

+1

Il link è obsoleto. E quale blocco "prima" è? Potresti per favore darci un esempio? – Aleksandrus

23

Meglio ancora, procedere come segue (quindi non è necessario creare un prima filtro per ogni suite di test)

Factory.define :confirmed_user, :parent => :user do |f| 
    f.after_create { |user| user.confirm! } 
end 

trovato qui: https://stackoverflow.com/a/4770075/1153149

Modifica per aggiungere la sintassi non deprecato

FactoryGirl.define do |f| 
    #Other factory definitions 

    factory :confirmed_user, :parent => :user do 
    after_create { |user| user.confirm! } 
    end 
end 

Modifica 27/01 per aggiornare la sintassi Anche in questo caso

FactoryGirl.define do 
    #Other factory definitions 

    factory :confirmed_user, :parent => :user do 
    after(:create) { |user| user.confirm! } 
    end 
end 
+1

ciao! Ho usato il tuo metodo e dice> metodo non definito after_create. perché? – oFca

+0

Ho bisogno di ulteriori informazioni, quale oggetto sta cercando di eseguire after_create su? Potrebbe essere che questo è tirato da una vecchia risposta.Penso che la sintassi Factory.define potrebbe essere sottratta. Modificherò la mia risposta con la sintassi aggiornata. Fammi sapere se questo non funziona. – Joeyjoejoejr

+0

Questa è una buona risposta e quello che uso di solito ... tranne che ThoughtBot ha cambiato di nuovo la sintassi (ci siamo ancora?). Dovrebbe essere 'after (: create) {... etc' – IAmNaN

30

Si potrebbe anche impostare l'attributo confirmed_at come segue. Funziona per me:

FactoryGirl.define do 
    factory :user do 
    full_name    "Aren Admin" 
    email     "[email protected]" 
    password    "arenaren" 
    password_confirmation "arenaren" 
    role_id    ADMIN 
    confirmed_at   Time.now 
    end 
end 
+0

Ho preferito questo metodo su 'confirm!' Perché è un'operazione in meno. – IAmNaN

+0

sostituito due righe con uno ... e un po 'più intuitivo, imo. Grazie! – brntsllvn

+0

Questo è il modo più pulito per farlo. Grazie: +1: – moeabdol

1

L'aggiunta di questa linea all'interno della definizione di fabbrica ha lavorato per me

prima (: creare) {| user | user.skip_confirmation! }

1

Mettere la logica confirmable Devise nel dopo (: build) richiamata ...

FactoryGirl.define do 
    factory :user do 
    after(:build) do |u| 
     u.confirm! 
     u.skip_confirmation_notification! 
    end 
... 
end 

Per me, mettendo confermare! o skip_confirmation! nel dopo (: create) il blocco ha causato errori di validazione sul parametro email e non ha funzionato.

+0

solo "u.skip_confirmation!" Dopo che la build funziona per me. rende anche più veloce la creazione dell'utente. – Musaffa

1

È necessario chiamare skip_confirmation! prima del create in modo che l'utente rimanga invariato.

before(:create) do |user| 
    user.skip_confirmation! 
end 
1

Questa è la fabbrica che ha funzionato per me

FactoryGirl.define do 
    factory :user do 
    sequence :email do |n| 
     "address#{n}@example.com" 
    end 
    sequence :password do |n| 
     "password#{n}" 
    end 

    factory :confirmed_user do 
     before(:create) {|user| user.skip_confirmation! } 
    end 
    end 
end 
Problemi correlati