2012-08-25 19 views
15

Uso de rails, idear, rspec & factorygirl:¿Dónde confirmo el usuario creado con FactoryGirl?

Intentando crear algunas pruebas para mi sitio. Estoy usando el modelo confirmable para diseñar, así que cuando creo un usuario usando FactoryGirl, el usuario no está confirmado.

Esta es mi 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 

y este es mi archivo de prueba rspec:

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 

Recibo un error porque el usuario no está confirmado. Al buscar, estoy bastante seguro de que necesito usar el método '¡confirmar!' y que pertenece al archivo fábricas.rb, pero no estoy seguro de dónde ponerlo.

Respuesta

9

Trate user.confirm! en su bloque before

encontró here

+1

Su enlace no está actualizado. ¿Y qué bloque "antes" es? ¿Podría darnos un ejemplo? – Aleksandrus

23

Mejor aún, haga lo siguiente (a continuación, no es necesario crear un filtro antes de cada conjunto de pruebas)

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

encontrado aquí: https://stackoverflow.com/a/4770075/1153149

Editar para añadir sintaxis no desaprobado

FactoryGirl.define do |f| 
    #Other factory definitions 

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

Edición 01/27 para actualizar Sintaxis Una vez más

FactoryGirl.define do 
    #Other factory definitions 

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

hola! He usado tu método y dice> método indefinido after_create. ¿porqué es eso? – oFca

+0

Necesito más información, ¿qué objeto está intentando ejecutar after_create? Puede ser que esto se extraiga de una respuesta anterior.Creo que la sintaxis de Factory.define puede estar desprotegida. Editaré mi respuesta con la sintaxis actualizada. Avísame si eso no funciona. – Joeyjoejoejr

+0

Esta es una buena respuesta y lo que suelo usar ... excepto ThoughtBot, cambió la sintaxis nuevamente (¿ya llegamos?). Debería ser 'after (: create) {... etc' – IAmNaN

30

También podría establecer el atributo confirmed_at de la siguiente manera. Funciona para mí:

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

He estado prefiriendo este método a 'confirm!' Porque es una operación menos. – IAmNaN

+0

reemplazó dos líneas con una ... y un poco más intuitiva, imo. ¡Gracias! – brntsllvn

+0

Esta es la forma más limpia de hacerlo. Gracias: +1: – moeabdol

1

La adición de esta línea dentro de la definición de la fábrica que funcionó para mí

antes (: crear) {| usuario | user.skip_confirmation! }

1

poner la lógica confirmable Diseñar en el después (: build) de devolución de llamada ...

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

Para mí, poniendo confirmar! o skip_confirmation! en el bloque after (: create) provocó errores de validación en el parámetro de correo electrónico y no funcionó.

+0

simplemente 'u.skip_confirmation!' Después de la compilación funciona para mí. también hace que la creación del usuario sea más rápida. – Musaffa

1

Debe llamar al skip_confirmation! antes de create, de modo que esto persiste en el usuario.

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

Esta es la fábrica que funcionó para mí

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 
Cuestiones relacionadas