Mocks arbeiten nicht mit RSpec und Devise
-
26-09-2019 - |
Frage
Ich arbeite an einer Rails 3 Web-App im Moment mit RSpec 2 und wir verwenden Devise für die Authentifizierung. Ein (und bald viele) unser Controller muss der Benutzer angemeldet sein. Ich weiß, dass die Devise sign_in
Test Helfer bietet, kann es aber mit einem RSpec oder Mokka Mock-Objekt verwendet werden?
I @user = mock_model(User)
ursprünglich versucht, wo Benutzer die Devise Klasse. Dies würde nicht Arbeit mit sign_in :user, @user
als get 'index'
auf das Zeichen in Form umleiten würde.
Hat jemand irgendwelche Erfahrungen mit Tests erarbeitet und kann helfen?
Lösung
Wir hatten ein ähnliches Problem, aber unter Verwendung von Factory Girl. Wir lösten es gerne so:
In spec_helper.rb:
config.include Devise::TestHelpers, :type => :controller
In der Controller-Spezifikation (nur eine Wrapper-Methode):
def login_user(user)
sign_in user
end
Dann in jeder Methode, die Sie benötigen, können Sie tun:
login_user(Factory(:user))
... wo Sie haben ein Benutzerobjekt in factories.rb definiert. Nicht sicher, ob dies mit Mocks funktioniert aber.
Andere Tipps
Ein Mock wird nie an der Arbeit. Wenn Sie sich anmelden sagen, wird der Benutzer in der Sitzung gespeichert (im Grunde, die Benutzerklasse und seine id). Wenn Sie den Controller zuzugreifen, wird eine andere Benutzerobjekt basierend auf den gespeicherten Daten abgerufen. Der beste Weg, das Problem mit etwas, dass verharrt das Objekt, wie Factory Girl.
lösenschlug ich das gleiche Problem. Ich mache folgendes jetzt:
before(:each) do
# sign_in mock_user
request.env['warden'] = mock(Warden, :authenticate => mock_user,
:authenticate! => mock_user)
end
Ich habe ein Problem geschaffen für hier diese: https://github.com/ plataformatec / devise / Ausgaben # Ausgabe / 928 Go Stimme!
Keiner von ihnen arbeitete für mich (MRI 1.9.3-preview1, Schienen 3.0.1.rc5).
Das ist die Lösung, die ich gefunden: http: / /blog.joshmcarthur.com/post/6407481655/integration-tests-with-devise-and-rspec