2017-12-14 6 views
1
  • Schienen (5.1.4)
  • rspec-Schienen (3.7.2)
  • Capybara (2.16.1)
  • devise (4.3.0)

Ich versuche, Erstellen Sie eine RSpec Rails 3.7-Systemspezifikation wie in https://relishapp.com/rspec/rspec-rails/v/3-7/docs/system-specs/system-spec.RSpec + Capybara + Devise: aktueller_Benutzer?

Zusätzlich möchte ich die Devise-Autorisierung anwenden. Ich folgte der Anweisung https://github.com/plataformatec/devise/wiki/How-To:-Test-with-Capybara

Aber ich denke, es ist eine Art von einer fehlerhaften Implementierung. Ich bekomme nicht die current_user Methode (das ist nil).

Hier ist meine einfache spec:

require 'rails_helper' 

RSpec.describe "testing system", type: :system do 

    it "tests the spec" do 

    admin = create(:admin) # user-admin 

    login_as(admin, :scope => :admin) 

    visit root_path 

    click_link 'Home' 

    save_and_open_page 

    end 
end 

Da der Code auf meiner Website stark auf den current_user Wert abhängig ist, verstehe ich nicht eine richtig gebildet gespeicherte Seite (es sieht aus wie ein Benutzer anmelden nicht) .

Was soll ich tun? Soll ich einfach manuell (irgendwie?) Einen Wert current_user zuweisen? Oder vielleicht ist die https://github.com/plataformatec/devise/wiki/How-To:-Test-with-Capybara Strategie hauptsächlich defekt und sollte zu etwas mehr vollwertiger Technologie ersetzt werden?

Ich habe bereits versucht

current_user = admin 

in meinem Code zu machen - aber ohne Ergebnis.

Antwort

2

Das Devise-Wiki ist korrekt für das Testen während der Verknüpfung von Logins, und nein, Sie können nicht nur current_user in Ihrem Testcode setzen (noch können Sie darauf zugreifen, da es nur in der Anfrage gesetzt ist). Im Allgemeinen wird angenommen, dass der Fehler in der Verwendung eines Edelsteins liegt, anstatt dass ein weit verbreiteter und stark getesteter Edelstein defekt ist.

Mit der Beschreibung, die Sie gegeben haben, gibt es eine Reihe von Gründen könnte nicht tatsächlich in dem Benutzer die Anmeldung jedoch die beiden wahrscheinlichsten Täter sind

  1. Haben Sie in Devise mehrere Bereiche konfiguriert eigentlich haben? oder sollte es einfach login_as(admin, :scope => :user) # entsprechen nur login_as (admin)

  2. Ist puma Ihre Tests im Single-Modus oder Cluster-Modus ausgeführt? (Sie müssen möglicherweise die Stummschaltung von Puma-Ausgang rspec-Rails deaktiviert standardmäßig - https://github.com/rspec/rspec-rails/blob/95f4522c0549a32de59c19eb9b5f9a72126a9eb6/lib/rspec/rails/example/system_example_group.rb#L72 - um das in der Test-Ausgabe zu sehen) Wenn es nicht im Single-Modus ist, wird die App in einem separaten Prozess als die Tests ausgeführt, was Devise bedeutet kann die Anmeldung nicht kurzschließen, und Sie müssen die Puma-Konfiguration reparieren.

+0

Ja, das Problem war über 'login_as (admin,: scope =>: user)' und 'login_as (admin)' funktioniert auch. Nur die Devise-Dokumentation war nicht klar genug. Und natürlich muss ich nicht auf "current_user" in meiner Spezifikation zugreifen - ich brauche es nur innerhalb des zu testenden Codes. Vielen Dank. – prograils