2010-12-13 9 views
27

Entiendo que el entorno de prueba de Rails se destruye y se reconstruye antes de cada prueba ... así que ¿cómo pruebo un controlador que requiere que un usuario inicie sesión y ese usuario puede? ¿Se creará sin que el módulo confirmable del dispositivo se interponga?Prueba (RSpec) con el módulo confirmable de Devise

Devise's recommended method (abajo) crea un nuevo usuario que luego se envía un correo electrónico por el módulo confirmable de Devise. ¿Cómo puedo evitar esto, así que no estoy 'creando' un usuario cada vez ... o si lo estoy, puedo obtener un objeto para probarlo sin "simular" un nuevo correo electrónico para cada especificación?

before(:each) do 
    @user = Factory.create(:user) 
    sign_in @user 
    end 

estoy seguro de que estoy pasando por alto algo dolorosamente obvio que esto debe ser una casualidad muy común para cualquier persona que utilice Diseñar con confirmable ...

Respuesta

32

En el entorno de prueba ActionMailer::Base.delivery_method se debe establecer en :test, lo que significa que estos correos electrónicos no serán enviados. Si esta configuración se establece en otra cosa como smtp mediante una configuración en, por ejemplo, config/environments.rb, se enviarán los correos electrónicos .

Si ese ajuste ya está allí, a continuación, utilizar el objeto User (como en, para ser realmente capaz de iniciar sesión) tendrá que llamar a confirm! en él:

user = User.first 
user.confirm! 
+0

también se puede mover la creación del usuario a un 'antes (: todos) 'bloque, para acelerarlo ... – iain

+0

Tuve que agregar' config.action_mailer.default_url_options = {: host => 'localhost: 3000'} 'para obtener pruebas para ejecutar ... de lo contrario' test.rb' es caldera plato, que yo sepa.Solo las configuraciones relacionadas con el correo en 'test.rb' o' environment.rb' son: 'config.action_mailer.delivery_method =: test'. – Meltemi

+1

por lo que 'ActionMailer :: Base.delivery_method =: test' diferente de alguna manera a' 'config.action_mailer.delivery_method =: test' auto-generated ?? – Meltemi

2

Trate stubbing active?

@user = Factory.create(:user) 
@user.stub(:active?).and_return(true) 
sign_in @user 

Es posible que también necesite un tocón confirmed?, no estoy muy familiarizado con Devise.

12

Si está utilizando factory_girl para generar sus modelos, puede usar after_create para confirmar a cada usuario nuevo.

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

Creo que obtendrás el mismo efecto al agregar' confirm_at Time.now' como un atributo de fábrica. – Giuseppe

1

Para la fabricación de la gema es

Fabricator(:user) do 
    after_build { |user| user.confirm! } 
end 
+2

¿No requeriría 'after_create', no' after_build'? – slothbear

+0

sí, debería ser after_create – Ricbermo

17

para la versión más reciente factorygirl:

FactoryGirl.define do 

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

end 
5

Hoy en día sólo se pone:

confirmed_at 7.days.ago

en su fabr ication

2

Para el dispositivo 4.2 ahora es confirm (no confirm!).

Source

4.2.0 - 2016-07-01

Remove the Devise::Models::Confirmable#confirm! method, use confirm instead.

código de abajo también evita que los anuncios publicitarios que se generen gracias a after(:build) vs after(:create) para establecer confirmed_at

FactoryGirl.define do 
    factory :user do 
    after(:build) { |u| u.skip_confirmation_notification! } 
    after(:create) { |u| u.confirm } 
    ... 
    end 
end 
Cuestiones relacionadas