before_filter :login_required lässt Tests fehlschlagen

Testen einer Rails-Anwendung

before_filter :login_required lässt Tests fehlschlagen

Beitragvon krasius am 29.03.2011, 22:22

Hallo,

ich habe meine Controller mit dem before_filter gesichert, so dass sie erst nach einem Login zu erreichen sind.

Als ein Beispiel habe ich meinen Unit Controller aufgeführt:

Code: Alles auswählen
class UnitsController < ApplicationController
  before_filter :login_required

  def index
    @units = Unit.all
  end

  def show
    @unit = Unit.find(params[:id])
  end

  def new                                                                                                                                                                   
    @unit = Unit.new
  end
...


Wenn ich nun die Tests mit rake test ausführe, schlagen sie fehl.

Ich habe einmal nur den Unit Test ausgeführt mit: ruby -Itest test/functional/units_controller_test.rb

Die folgenden Fehler werden dann angezeigt:

Code: Alles auswählen
Loaded suite test/functional/units_controller_test
Started
FEFFFEFFF

  1) Failure:
test_create_invalid(UnitsControllerTest) [test/functional/units_controller_test.rb:34]:
expecting <"new"> but rendering with <"">

  2) Error:
test_create_valid(UnitsControllerTest):
ActionController::RoutingError: No route matches {:action=>"show", :controller=>"units"}
    test/functional/units_controller_test.rb:40:in `test_create_valid'

  3) Failure:
test_destroy(UnitsControllerTest) [test/functional/units_controller_test.rb:63]:
Expected response to be a redirect to <http://test.host/units> but was a redirect to <http://test.host/login>.

  4) Failure:
test_edit(UnitsControllerTest) [test/functional/units_controller_test.rb:45]:
expecting <"edit"> but rendering with <"">

  5) Failure:
test_index(UnitsControllerTest) [test/functional/units_controller_test.rb:17]:
expecting <"index"> but rendering with <"">

  6) Error:
test_new(UnitsControllerTest):
NoMethodError: undefined method `login_as' for test_new(UnitsControllerTest):UnitsControllerTest
    test/functional/units_controller_test.rb:26:in `test_new'

  7) Failure:
test_show(UnitsControllerTest) [test/functional/units_controller_test.rb:22]:
expecting <"show"> but rendering with <"">

  8) Failure:
test_update_invalid(UnitsControllerTest) [test/functional/units_controller_test.rb:51]:
expecting <"edit"> but rendering with <"">

  9) Failure:
test_update_valid(UnitsControllerTest) [test/functional/units_controller_test.rb:57]:
Expected response to be a redirect to <http://test.host/units/298486374> but was a redirect to <http://test.host/login>.

Finished in 1.50476625 seconds.

9 tests, 9 assertions, 7 failures, 2 errors, 0 pendings, 0 omissions, 0 notifications
0% passed

5.98 tests/s, 5.98 assertions/s


Wenn ich die Zeile before_filter :login_required aus dem Unit Controller wieder entferne, laufen die Tests ohne Fehler durch.

Ich habe nun schon zwei Tage gegoogled, um dafür eine Lösung zu finden ,aber entweder werden andere Ansätze verfolgt, oder es ist nicht auf mein Beispiel anwendbar.

Ich habe wirklich keine Ahnung, wo ich noch suchen soll. Obwohl ich eigentlich denke, dass ich da nichts besonderes erstellt habe und das andere das auch so machen?

Ich hoffe wirklich auf Hilfe.
krasius
 
Beiträge: 3
Registriert: 29.03.2011, 22:02

Re: before_filter :login_required lässt Tests fehlschlagen

Beitragvon krasius am 30.03.2011, 20:20

Vielleicht hilft es ja noch zu erwähnen, dass ich eine controller_authentication.rb Datei in meinem /lib Ordner habe. Der Inhalt der Datei ist:

Code: Alles auswählen
module ControllerAuthentication
  def self.included(controller)
    controller.send :helper_method, :current_user, :logged_in?, :redirect_to_target_or_default
  end

  def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end

  def logged_in?
    current_user
  end

  def login_required
    unless logged_in?
      store_target_location
      redirect_to login_url, :alert => "You must first log in or sign up before accessing this page."
    end
  end

  def redirect_to_target_or_default(default, *args)
    redirect_to(session[:return_to] || default, *args)
    session[:return_to] = nil
  end

  private

  def store_target_location
    session[:return_to] = request.url
  end
end


Kann man davon etwas verwenden, damit sich die Test anmelden können und authentiziert sind? Der Fehler scheint ja daran zu liegen, dass die Tests sich nicht einloggen können, oder nicht eingeloggt sind.
krasius
 
Beiträge: 3
Registriert: 29.03.2011, 22:02

Re: before_filter :login_required lässt Tests fehlschlagen

Beitragvon krasius am 31.03.2011, 19:56

Ich habe eine Lösung gefunden, durch die ich meine Tests ohne Fehler ausführen konnte. Dabei nutze ich Fixtures und passe meine Tests mit einer Anmeldefunktion an. Einen kleinen Artikel dazu habe ich hier geschrieben:

http://www.faustas.de/rails-test-error-beforefilter-loginrequired-controller
krasius
 
Beiträge: 3
Registriert: 29.03.2011, 22:02


Zurück zu Testen

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron