2012-08-25 9 views
15

Verwenden von Schienen, entwickeln, rspec & FactoryGirl:Wo bestätige ich den mit FactoryGirl erstellten Benutzer?

Der Versuch, einige Tests für meine Website zu erstellen. Ich verwende das bestätigbare Modell für die Entwicklung. Wenn ich einen Benutzer mit FactoryGirl erstelle, wird der Benutzer nicht bestätigt.

Das ist mein 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 

Und das ist meine rspec Testdatei:

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 

Ich erhalte eine Fehlermeldung, da der Benutzer nicht bestätigt wird. Durch die Suche bin ich mir ziemlich sicher, dass ich die Methode 'Bestätigen' verwenden muss. und dass es in die factories.rb Datei gehört, aber ich bin mir nicht sicher wo ich es hinstellen soll.

Antwort

9

Versuchen user.confirm! in Ihrem before Block

here

+1

Ihr Link veraltet ist für mich gearbeitet. Und welcher "Vorher" Block ist das? Könnten Sie uns bitte ein Beispiel geben? – Aleksandrus

23

Noch besser wäre es gefunden, gehen Sie wie folgt (dann brauchen Sie nicht eine für jede Testsuite vor Filter erstellen)

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

hier gefunden: https://stackoverflow.com/a/4770075/1153149

bearbeiten nicht veraltet Syntax

FactoryGirl.define do |f| 
    #Other factory definitions 

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

bearbeiten 27.1 So nutzen Sie Update Syntax Wieder

FactoryGirl.define do 
    #Other factory definitions 

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

Hallo! Ich habe Ihre Methode verwendet und es heißt> undefined Methode after_create. Warum das? – oFca

+0

Ich benötige weitere Informationen, auf welches Objekt versucht man nachher_create zu laufen? Es könnte sein, dass dies aus einer alten Antwort gezogen wird.Ich denke, dass die Syntax von Factory.define entzogen sein könnte. Ich bearbeite meine Antwort mit der aktuellen Syntax. Lass es mich wissen, wenn das nicht funktioniert. – Joeyjoejoejr

+0

Dies ist eine gute Antwort und was ich normalerweise verwende ... außer ThoughtBot hat die Syntax wieder geändert (sind wir schon da?). Es sollte 'nach (: create) {... etc' – IAmNaN

30

Sie könnten auch die confirmed_at Attribut wie folgt hinzufügen. Funktioniert bei mir:

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

Ich bevorzuge diese Methode über 'bestätigen!', Weil es eine Operation weniger ist. – IAmNaN

+0

ersetzt zwei Zeilen mit einem ... und ein wenig intuitiver, imo. Vielen Dank! – brntsllvn

+0

Dies ist der sauberste Weg, es zu tun. Danke: +1: – moeabdol

1

diese Zeile hinzufügen, die in der Fabrik Definition für mich

arbeitete

vor (: create) {| Benutzer | user.skip_bestätigung! }

1

Setzen Sie die Devise confirmable Logik in dem nach (: build) Rückruf ...

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

Für mich bestätigen setzen! oder skip_confirmation! im after (: create) -Block verursachte Validierungsfehler beim Email-Parameter und funktionierte nicht.

+0

nur 'u.skip_confirmation!' Nach dem Build funktioniert für mich. es macht auch die Benutzererstellung schneller. – Musaffa

1

Sie sollten skip_confirmation! vor create anrufen, so dass dies für den Benutzer beibehalten wird.

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

Dies ist die Fabrik, die

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 
Verwandte Themen