2010-12-13 13 views
27

Es ist mein Verständnis, dass die Testumgebung von Rails vor jedem Test abgerissen und neu aufgebaut wird ... also wie kann ich einen Controller testen, bei dem ein Benutzer angemeldet sein muss und dieser Benutzer ' t erstellt werden, ohne dass das Bestätigungsmodul des Geräts in die Quere kommt?Testen (RSpec) mit dem bestätigbaren Modul von Devise

Devices recommended method (unten) erstellt einen neuen Benutzer, der dann eine E-Mail von Devise confirmable Modul gesendet wird. Wie komme ich dazu, so dass ich nicht jedes Mal einen Benutzer "erstelle" ... oder wenn ich bin, kann ich ein Objekt zum Testen bekommen, ohne eine neue Email für jede Spezifikation zu "simulieren"? mit Devise mit confirmable ...

Antwort

32

In der Testumgebung

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

Ich bin sicher, ich bin etwas schmerzlich klar, wie dies mit Blick muss eine sehr verbreitete Spezifikation für jedermann seine ActionMailer::Base.delivery_method sollte :test eingestellt werden, Das bedeutet, dass diese E-Mails nicht versendet werden. Wenn diese Einstellung auf etwas anderes wie smtp mittels einer Konfiguration in beispielsweise config/environments.rb gesetzt wird, dann werden die E-Mails gesendet.

Wenn diese Einstellung bereits vorhanden ist, dann zu verwenden, um das User Objekt (wie in, tatsächlich in der Lage sein, sich anzumelden) Sie benötigen confirm! darauf zu nennen:

user = User.first 
user.confirm! 
+0

dank after(:build) vs after(:create) erzeugt wird, könnte die Schaffung des Benutzers zu einem 'vor (bewegen: alle) 'block, um es zu beschleunigen ... – iain

+0

Ich musste' config.action_mailer.default_url_options = {: host => 'localhost: 3000'} 'hinzufügen, damit Tests ausgeführt werden ... sonst' test.rb' ist Kessel Platte, meines Wissens.Nur Mail-bezogene Konfigurationen in 'test.rb' oder' environment.rb' sind: 'config.action_mailer.delivery_method =: test'. – Meltemi

+1

also ist 'ActionMailer :: Base.delivery_method =: test' irgendwie anders als die automatisch generierte' config.action_mailer.delivery_method =: test' ?? – Meltemi

2

Versuchen stubbing active?

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

Möglicherweise müssen Sie auch stub confirmed?, ich bin nicht vertraut mit Devise.

12

Wenn Sie Factory_Girl verwenden, um Ihre Modelle zu generieren, können Sie after_create verwenden, um jeden neuen Benutzer zu bestätigen.

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

Ich glaube, dass du den gleichen Effekt bekommst, indem du' confirmed_at Time.now' als Factory-Attribut hinzufügst. – Giuseppe

1

Zur Herstellung gem es ist

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

Würde es nicht 'after_create', nicht' after_build' erfordern? – slothbear

+0

Ja, es sollte after_create sein – Ricbermo

17

für neueste Version factory:

FactoryGirl.define do 

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

end 
5

Heute ist es gerade gestellt wird:

confirmed_at 7.days.ago

auf Ihrem fabr ication

2

Für Devise 4.2 ist es jetzt confirm (nicht confirm!).

Source

4.2.0 - 2016-07-01

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

-Code unten auch Mailer verhindert, dass Sie auch für die Einstellung confirmed_at

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