2012-08-25 11 views
15

Używanie szyn, programowanie, rspec & pracownik fabryki:Gdzie mogę potwierdzić użytkownika utworzonego za pomocą FactoryGirl?

Próbuję utworzyć testy dla mojej witryny. Używam modelu do zatwierdzenia do projektowania, więc kiedy tworzę użytkownika za pomocą FactoryGirl, użytkownik nie jest potwierdzony.

To mój 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 

A to moja rspec plik testowy:

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 

Dostaję błąd, ponieważ użytkownik nie jest potwierdzone. Rozglądając się, jestem pewien, że muszę użyć metody "potwierdź!" i że należy do pliku factories.rb, ale nie jestem pewien, gdzie go umieścić.

Odpowiedz

9

Spróbuj user.confirm! w bloku before

znalezionego here

+1

Twój link jest przestarzały. I który to blok "przed"? Czy mógłbyś podać nam przykład? – Aleksandrus

23

Jeszcze lepiej, wykonaj następujące czynności (wtedy nie trzeba utworzyć przed filtr dla każdego zestawu testowego)

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

znaleźć tutaj: https://stackoverflow.com/a/4770075/1153149

Edytuj, aby dodać składnią inną niż przestarzałe

FactoryGirl.define do |f| 
    #Other factory definitions 

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

Edycja 01/27 Aby zaktualizować Składnia Ponownie

FactoryGirl.define do 
    #Other factory definitions 

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

cześć! Użyłem twojej metody i mówi ona> niezdefiniowaną metodę after_create. dlaczego? – oFca

+0

Potrzebuję więcej informacji, jaki obiekt próbuje uruchomić after_create? Być może jest to wyciągnięte ze starej odpowiedzi.Myślę, że składnia Factory.define może być zdeponowana. Będę edytować moją odpowiedź za pomocą aktualnej składni. Daj mi znać, jeśli to nie zadziała. – Joeyjoejoejr

+0

To jest dobra odpowiedź i zwykle używam ... z wyjątkiem ThoughtBot ponownie zmieniłem składnię (czy jesteśmy tam jeszcze?). Powinno to być "after (: create) {... etc" – IAmNaN

30

Można również ustawić atrybut confirmed_at następująco. Pracuje dla mnie:

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

Preferuję tę metodę powyżej 'confirm!', Ponieważ jest to jedna operacja mniej. – IAmNaN

+0

zastąpił dwie linie jedną ... i trochę bardziej intuicyjną, imo. Dzięki! – brntsllvn

+0

To najczystszy sposób na zrobienie tego. Dzięki: +1: – moeabdol

1

Dodanie tej linii wewnątrz definicja fabryka pracował dla mnie

przed (: tworzenie) {| użytkownik | user.skip_confirmation! }

1

Umieść opracować POTWIERDZALNE logikę w (po): Budowa zwrotnego ...

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

Dla mnie, kładąc potwierdzić! lub skip_confirmation! w bloku after (: create) spowodował błędy sprawdzania poprawności w parametrze e-mail i nie działał.

+0

Po prostu 'u.skip_confirmation!' Po kompilacji działa dla mnie. to również przyspiesza tworzenie użytkowników. – Musaffa

1

Powinieneś zadzwonić pod numer skip_confirmation! przed create, więc jest to utrwalone dla użytkownika.

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

To jest fabryka, która pracowała dla mnie

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 
Powiązane problemy